Как сериализовать класс, производный от класса, оформленного 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 ответа
Я думаю, что вы можете использовать "суррогат контракта данных" здесь (используется через интерфейс 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/