Как сериализовать класс, производный от класса, оформленного с помощью DataContract (IsReference = true)? - PullRequest
2 голосов
/ 27 ноября 2011

У меня есть 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 голосов
/ 26 апреля 2012

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

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

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

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

1 голос
/ 10 июля 2012

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

Подробное описание здесь:

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

...