Mam podwójnie połączoną listę, którą próbuję deserialise.JSON .Net nie szanuje PreserveReferencesHandling na Deserializacji
Mój scenariusz ściśle dotyczy to SO: Doubly Linked List to JSON
Mam następujące ustawienia JSON:
_jsonSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ObjectCreationHandling = ObjectCreationHandling.Auto
};
Kiedy patrzę na wyjściu odcinkach wydaje się poprawne, a odniesienia między węzłami są prawidłowo reprezentowane.
Gdy dane są deserializowane, właściwości nadrzędne w obiektach podrzędnych mają wartość NULL, mimo że są wypełnione poprawką $ poprawnie.
Poniżej znajduje się próbka JSON (przyciętą dla czytelności)
W trakcie pisania tego pytania - mogę widzieli źródło kłopotów ...
obiektów w „Dzieci "Właściwość array nie ma atrybutów typu $.
To może być dlatego, że dzieci i zaawansowane właściwości są typu rodzajowy T.
Rzeczywiste typu są szeregowane jest klasa pochodną TemplateDataLinkedListBase
public class TemplateDataQueryElement : TemplateDataLinkedListBase<TemplateDataQueryElement>
Tutaj fragment podstawy klasa:
public class TemplateDataLinkedListBase<T> where T : TemplateDataLinkedListBase<T>
{
[JsonProperty(TypeNameHandling = TypeNameHandling.Objects)]
public T Parent { get; set; }
[JsonProperty(TypeNameHandling=TypeNameHandling.Objects)]
public List<T> Children { get; set; }
}
Jak mogę deserialise ten JSON w taki sposób, że nieruchomość Dominująca nie jest null i zawiera odniesienie do th e obiekt nadrzędny?
{
"$id": "9",
"$type": "Contracts.Models.TemplateDataQueryElement, Contracts",
"Query": null,
"Parent": null,
"Children": [
{
"$id": "11",
"Query": null,
"Parent": {
"$ref": "9"
},
"Children": [
{
"$id": "13",
"Query": null,
"Parent": {
"$ref": "11"
},
"Children": [],
"EntityName": "Widgets",
"Fields": [
"Id"
],
"Key": ""
},
Oto linki Pastebin do odpowiedniego kodu:
http://pastebin.com/i1jxVGG3 http://pastebin.com/T1xqEWW2 http://pastebin.com/ha42SeF7 http://pastebin.com/cezwZqx6 http://pastebin.com/uFbTbUZe http://pastebin.com/sRhNQgzh
Czy możesz umieścić całą definicję klasy, aby lepiej zrozumieć, co się dzieje? –
A także przykład sposobu przeprowadzania serializacji i deserializacji? –
Witam @ IlijaDimov Zawarłem linki do kodu źródłowego – RobD