如何序列化从用datacontract装饰的类衍生的类(isReference = true)?[英] How to serialize class that derives from class decorated with DataContract(IsReference=true)?

本文是小编为大家收集整理的关于如何序列化从用datacontract装饰的类衍生的类(isReference = true)?的处理方法,想解了如何序列化从用datacontract装饰的类衍生的类(isReference = true)?的问题怎么解决?如何序列化从用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,但我认为有更优雅的方法可以做到.

你能建议我怎么做吗?

推荐答案

我认为您可以在此处使用"数据合同替代"(通过idatacontractsurrogate接口使用.)

数据合同代理是基于您已经使用的数据合同模型的高级功能.它使您可以在要更改类型的序列化,应对序列化的方式或(如果您正在处理XML)中,则可以进行定制和替换.

在您的情况下,使用idatacontractsurrogate可以让您以每型或每对象进行自定义的JSON序列化和避难所化. idatacontractsurrogate将提供在序列化和避免时,Datacontractsjsonerializer将一种类型替换为另一种类型所需的方法,您可能希望为您的场景提供另一种"特殊"中介类型.

>

希望这会有所帮助!

其他推荐答案

json.net支持标记为IsReference=true的对象的序列化.

这里有详细的演练:

本文地址:https://www.itbaoku.cn/post/1794039.html