У меня есть двойной список, который я пытаюсь десериализовать.JSON .Net, не уважающий PreserveReferencesHandling при десериализации
Мой сценарий тесно связан с этим SO: Doubly Linked List to JSON
У меня есть следующие настройки JSON:
_jsonSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ObjectCreationHandling = ObjectCreationHandling.Auto
};
Когда я смотрю на сериализованном выходе, оказывается правильным, а ссылки между узлами правильно представлял.
Когда данные десериализованы, свойства родителя в объектах Child имеют значение NULL, хотя они заполнены корректно.
Ниже приведен образец JSON (обрезанный для удобства чтения)
В процессе печатает этот вопрос - я, возможно, видел источник неприятностей ...
объектов в «Детях «Свойство массива не имеет атрибутов типа $.
Это может быть потому, что дети и свойства Родительские имеют родовое типа T.
Обратите внимание, что фактический тип сериализации является производным классом TemplateDataLinkedListBase
public class TemplateDataQueryElement : TemplateDataLinkedListBase<TemplateDataQueryElement>
Вот выдержка из базы класс:
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; }
}
Как deserialise этот JSON таким образом, что свойство Parent не равно нулю и содержит ссылку на го e родительский объект?
{
"$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": ""
},
Вот Pastebin ссылки на соответствующий код:
http://pastebin.com/i1jxVGG3 http://pastebin.com/T1xqEWW2 http://pastebin.com/ha42SeF7 http://pastebin.com/cezwZqx6 http://pastebin.com/uFbTbUZe http://pastebin.com/sRhNQgzh
Можете ли вы опубликовать определение всех классов, чтобы лучше понять, что происходит? –
А также пример того, как вы выполняете сериализацию и десериализацию? –
Привет @IlijaDimov Я включил ссылки на исходный код – RobD