Json и Circular Reference Exception

У меня есть объект, который имеет циклическую ссылку на другой объект. Учитывая отношения между этими объектами это - правильный дизайн.

Проиллюстрировать

Machine => Customer => Machine

Как ожидается, я сталкиваюсь с проблемой, когда я пытаюсь использовать Json для сериализации потребительского объекта или машины. То, в чем я не уверен, - то, как решить этот вопрос, поскольку я не хочу повреждать отношения между Машинами и Потребительскими объектами. Каковы опции для того, чтобы решить этот вопрос?

Править

В настоящее время я использую метод Json, предоставленный базовым классом Контроллера. Таким образом, сериализация, которую я делаю, является столь же основной как:

Json(machineForm);

39
задан ahsteele 4 January 2010 в 23:47
поделиться

3 ответа

Обновление:

Не пытайтесь использовать NonSerializedAttribute, так как JavaScriptSerializer видимо игнорирует его.

Вместо этого используйте ScriptIgnoreAttribute в System.Script.Serialization.

public class Machine
{
    public string Customer { get; set; }

    // Other members
    // ...
}

public class Customer
{
    [ScriptIgnore]
    public Machine Machine { get; set; }    // Parent reference?

    // Other members
    // ...
}

Таким образом, когда вы выбрасываете Машину в метод Джсона , она будет пересекать отношения от Машины к Клиенту , но не будет пытаться вернуться обратно от Клиента к Машине .

Отношения все еще существуют, чтобы ваш код делал то, что вам нравится, но JavaScriptSerializer (используемый методом Json) проигнорирует его.

.
57
ответ дан 27 November 2019 в 02:12
поделиться

Вам нужно решить, какой из них является "корневым" объектом. Скажем, машина - это "корень", а клиент - это подобъект машины. Когда вы сериализуете машину, заказчик будет сериализован как подобъект в JSON, а когда заказчик будет сериализован, он будет NOT сериализовать обратную ссылку на машину. Когда ваш код десериализует машину, он десериализует клиентский вложенный объект машины и восстанавливает обратную ссылку от клиента на машину.

Большинство библиотек сериализации предоставляют какой-то крюк для изменения того, как выполняется десериализация для каждого класса. Вам нужно использовать этот крючок для изменения десериализации для машинного класса, чтобы восстановить обратную ссылку в клиенте машины. Точно, что это за крючок, зависит от используемой вами JSON-библиотеки.

.
0
ответ дан 27 November 2019 в 02:12
поделиться
[

] Поскольку, насколько мне известно, вы не можете сериализовать объектные ссылки, а только копии, вы можете попробовать использовать немного грязного взлома, который идет что-то вроде этого:[

] [
    ] [
  1. ]Клиент должен сериализовать свою ссылку на машину как идентификатор машины [
  2. ] [
  3. ]Когда вы десериализуете json-код, вы можете запустить простую функцию поверх него, которая преобразует эти идентификаторы в правильные ссылки. [
  4. ] [
]
1
ответ дан 27 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: