У меня есть объект, который имеет циклическую ссылку на другой объект. Учитывая отношения между этими объектами это - правильный дизайн.
Проиллюстрировать
Machine => Customer => Machine
Как ожидается, я сталкиваюсь с проблемой, когда я пытаюсь использовать Json для сериализации потребительского объекта или машины. То, в чем я не уверен, - то, как решить этот вопрос, поскольку я не хочу повреждать отношения между Машинами и Потребительскими объектами. Каковы опции для того, чтобы решить этот вопрос?
Править
В настоящее время я использую метод Json, предоставленный базовым классом Контроллера. Таким образом, сериализация, которую я делаю, является столь же основной как:
Json(machineForm);
Обновление:
Не пытайтесь использовать 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
) проигнорирует его.
Вам нужно решить, какой из них является "корневым" объектом. Скажем, машина - это "корень", а клиент - это подобъект машины. Когда вы сериализуете машину, заказчик будет сериализован как подобъект в JSON, а когда заказчик будет сериализован, он будет NOT сериализовать обратную ссылку на машину. Когда ваш код десериализует машину, он десериализует клиентский вложенный объект машины и восстанавливает обратную ссылку от клиента на машину.
Большинство библиотек сериализации предоставляют какой-то крюк для изменения того, как выполняется десериализация для каждого класса. Вам нужно использовать этот крючок для изменения десериализации для машинного класса, чтобы восстановить обратную ссылку в клиенте машины. Точно, что это за крючок, зависит от используемой вами JSON-библиотеки.
.] Поскольку, насколько мне известно, вы не можете сериализовать объектные ссылки, а только копии, вы можете попробовать использовать немного грязного взлома, который идет что-то вроде этого:[
] [