Управление ссылками после десериализации

У меня есть объект, 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 обратно, он "повторно ссылается" на любые такие объекты, сериализованные таким образом.

См. Пример " Сохранение ссылок".

Другие вопросы по тегам