сериализовать класс как объект

#c# #json #serialization

#c# #json #сериализация

Вопрос:

Используя JSON.NET — Я пытаюсь сериализовать массовую коллекцию объектов, которая может содержать любой другой объект, который может содержать любое количество массивов других объектов. При выполнении сериализации и десериализации данные вводятся неправильно / уничтожаются. Часы поисков спустя, не могу разгадать.

 public class SubClass
{
    public string theString;
}

public class MasterClass
{
    public object theObj;
}
 

Пример кода:

 SubClass thesubclass = new SubClass(); thesubclass.theString = "TESTSTRING";
MasterClass theMaster = new MasterClass();
theMaster.theObj = thesubclass;

string jsonOut = JsonConvert.SerializeObject(theMaster, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All});
textBox1.Text = jsonOut;
//Out1: {"$type":"WindowsFormsApplication1.MasterClass, WindowsFormsApplication1","theObj":{"$type":"WindowsFormsApplication1.SubClass, WindowsFormsApplication1","theString":"TESTSTRING"}}

MasterClass testMaster = JsonConvert.DeserializeObject<MasterClass>(jsonOut);
string jsonOut2 = JsonConvert.SerializeObject(testMaster, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All});
textBox2.Text = jsonOut2;


//Out2: {"$type":"WindowsFormsApplication1.MasterClass, WindowsFormsApplication1","theObj":{"theString":"TESTSTRING"}}
 

По сути, любой объект, прошедший мимо основного объекта, теряет свой тип. //Out2 должен совпадать с //Out1, но они никогда этого не делают. Справка

Ответ №1:

Вам также необходимо установить TypeNameHandling параметр при десериализации:

 MasterClass testMaster = JsonConvert.DeserializeObject<MasterClass>(jsonOut, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All });
 

Комментарии:

1. Вау, все это время… большое вам спасибо, это отлично решило проблему. 750-мегабайтный JSON-дамп для сотен случайных объектов теперь содержит все правильные объекты везде. Буду голосовать, когда у меня будет 15 повторений

2. Рад быть полезным 😉