Управление ссылками после десериализации
У меня есть объект, Course
, Курс имеет, как свойство, список других курсов, которые являются предварительными условиями:
public class Course
{
public List<Course> Prereqs { get; set; }
...
}
Я создаю список курсов в своем приложении и сериализую его. Список позже загружается и десериализуется.
Предположим, у меня есть два курса: Исчисление 1 и Исчисление 2. Исчисление 1 не имеет предварительных условий, а Исчисление 2 имеет Исчисление 1 как предварительное условие. Мое приложение создает список под названием Curriculum
: List<Course> Curriculum = JsonConvert.Deserialize<List<Course>>(serializedList);
Теперь предположим, что я хочу изменить заголовок Исчисления 1 с "Исчисления 1" на "Исчисление с одной переменной" (который, давайте представим, первый элемент в списке):
Course Math101 = Curriculum[0];
Math101.CourseName = "Single Variable Calculus";
Однако, если я сделаю: Curriculum[1].Prerequisites[0].CourseName; \\ spit out the CourseName for Math101, as recorded as a pre-req for Math102
тогда я получаю "Исчисление 1".
Это потому что когда Curriculum
сериализуется, сериализуется Curriculum[0]
(Calc 1) и Curriculum[1].Prerequisite[0]
(также Calc 1) отдельно.
Мой вопрос Есть ли простой способ управлять сериализацией того, что должно быть ссылочными типами, используя C# и JSON?
1 ответ
Если вы хотите "сохранить ссылки в графе объектов" во время сериализации, то необходимо использовать инструмент (или ручной процесс), который может кодировать информацию о связывании. Json.NET действительно может поддерживать эту сериализацию "по ссылке".
По сути, после того, как кодер впервые увидит конкретный объект, он испустит заглушку $id
свойство с отличным значением (которое связано через $ref
) в полученном JSON. Когда Json.NET считывает JSON обратно, он "повторно ссылается" на любые такие объекты, сериализованные таким образом.
См. Пример " Сохранение ссылок".