Как сериализовать класс, производный от класса, украшенного DataContract(IsReference=true)?


У меня есть class A, что происходит от System.Data.Objects.DataClasses.EntityObject. Когда я пытаюсь сериализовать с помощью

var a = new A();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(a.GetType());
serializer.WriteObject(Response.OutputStream, a);  

Я получаю ошибку

TestController+A._Id' is not marked with OptionalFieldAttribute, thus indicating that it must be serialized. However, 'TestController+A' derives from a class marked with DataContractAttribute and an IsReference setting of 'True'. It is not possible to have required data members on IsReference classes. Either decorate 'TestController+A._Id' with OptionalFieldAttribute, or disable the IsReference setting on the appropriate parent class.

Даже если я украшу поле OptionalFieldAttribute, я получу

The type 'TestController+A' cannot be serialized to JSON because its IsReference setting is 'True'. The JSON format does not support references because there is no standardized format for representing references. To enable serialization, disable the IsReference setting on the type or an appropriate parent class of the type.

Я не могу изменить класс EntityObject. Я думал создать A_Bag класс точно как A класс и заполнить его и сериализовать его вместо A, но я думаю, что есть более элегантный способ сделать это.

Можете ли вы подсказать, как я могу это сделать?
2 2

2 ответа:

Я думаю, что вы можете использовать "суррогат контракта данных" здесь (используется через интерфейс IDataContractSurrogate.)

Суррогат контракта данных-это расширенная функция, построенная на модели контракта данных, которую вы уже используете. Он позволяет выполнять настройку и подстановку типов в ситуациях, когда требуется изменить способ сериализации, десериализации или (если вы имеете дело с XML) проецирования типа в схему.

В вашем случае использование IDataContractSurrogate позволяет выполнять пользовательский JSON сериализация и десериализация на основе типа или объекта. IDataContractSurrogate предоставляет методы, необходимые для замены одного типа другим DataContractSJsonerializer во время сериализации и десериализации, и вы можете предоставить другой "специальный" промежуточный тип для вашего сценария.

Надеюсь, это поможет!

JSON.Net поддерживает сериализацию объектов, помеченных символом IsReference=true.

Здесь есть подробное пошаговое руководство:

Http://dotnet.learningtree.com/2012/04/03/working-with-the-entity-framework-and-the-web-api/