2014-02-20 4 views
1

У меня есть объект, 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?

+0

Я думаю, что часть вашей проблемы - это путаница между курсами (которые имеют prereqs) и «зачислениями», которые имеют оценки. Зачислением будет запись студента, зачисленного на курс в течение срока. У него были бы атрибуты, такие как посещаемость, оценки, возможно, результаты тестов и т. Д. –

+0

@JohnSaunders Честно говоря, это не мое замешательство. Это приведенный пример, который изоморфен гораздо большей проблеме, учитывая контекст, который должен быть широко знакомым. – Emily

+0

Итак, вы спрашиваете, как сохранить идентификатор объекта? Кроме того, есть ли у вас какие-либо потенциальные проблемы с круговыми или множественными ссылками? –

ответ

2

Если вы хотите «сохранить ссылки в графе объектов» через сериализацию, тогда необходимо использовать инструмент (или ручной процесс), который может кодировать информацию привязки. Json.NET действительно может поддерживать эту сериализацию «по ссылке».

В принципе, после того, как в первый раз кодер видит конкретный объект, он будет излучать заглушки $id свойства с отличным значением (который связан с помощью $ref) в результате JSON. Когда Json.NET читает JSON, он будет «повторно ссылаться» на любые такие объекты, сериализованные таким образом.

См. Пример Preserving References.

+0

Бинго! Отлично! – Emily

+0

@Arkamis Я рекомендую попробовать сгладить/упростить структуру, если возможно .. только потому, что она поддерживается [в Json.NET], не означает, что она должна использоваться, хотя, возможно, это одно из тех случаев. По крайней мере, это другой молот. :) – user2864740

+0

Я думаю, что это не страшное решение. Другое решение - хранить ключи и поддерживать отдельный список курсов, тогда я всегда могу найти курс по ключу. Однако ... это означает, что другие вещи немного сложнее. – Emily

Смежные вопросы