Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何序列化从用DataContract修饰的类派生的类(IsReference=true)?_C# 4.0_Datacontract_Jsonserializer_Datacontractjsonserializer - Fatal编程技术网

C# 4.0 如何序列化从用DataContract修饰的类派生的类(IsReference=true)?

C# 4.0 如何序列化从用DataContract修饰的类派生的类(IsReference=true)?,c#-4.0,datacontract,jsonserializer,datacontractjsonserializer,C# 4.0,Datacontract,Jsonserializer,Datacontractjsonserializer,我有一个类,它派生自System.Data.Objects.DataClasses.EntityObject。 当我尝试使用 var a = new A(); DataContractJsonSerializer serializer = new DataContractJsonSerializer(a.GetType()); serializer.WriteObject(Response.OutputStream, a); 我犯了一个错误 TestController+A._Id”没有用

我有一个
,它派生自
System.Data.Objects.DataClasses.EntityObject
。 当我尝试使用

var a = new A();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(a.GetType());
serializer.WriteObject(Response.OutputStream, a);  
我犯了一个错误

TestController+A._Id”没有用optionalfieldtribute标记,因此表示它必须序列化。但是,“TestController+A”派生自标记有DataContractAttribute和IsReference设置为“True”的类。IsReference类上不可能有必需的数据成员。用OptionalFieldAttribute修饰“TestController+A._Id”,或禁用相应父类上的IsReference设置。

即使我用
OptionalFieldAttribute
装饰字段,我也会得到

无法将类型“TestController+A”序列化为JSON,因为其IsReference设置为“True”。JSON格式不支持引用,因为没有用于表示引用的标准格式。要启用序列化,请禁用该类型或该类型的适当父类上的IsReference设置。

我无法修改
EntityObject
类。我想创建一个与
A
类完全相同的
A
类,然后填充并序列化它,而不是
A
,但我认为有更优雅的方法来实现它

你能建议我怎么做吗?

我想你可以在这里使用“数据契约代理”(通过IDataContractProgate接口使用)

数据契约代理是一种基于您已经使用的数据契约模型构建的高级功能。它允许您在需要更改类型序列化、反序列化或(如果您正在处理XML)投影到模式中的方式的情况下进行类型自定义和替换

在您的例子中,使用IDataContractSurrogate可以按类型或对象进行自定义JSON序列化和反序列化。IDataContractSurrogate将提供在序列化和反序列化期间由DataContractSJsonerializer将一种类型替换为另一种类型所需的方法,并且您可能希望为场景提供不同的“特殊”中介类型


希望这有帮助

JSON.Net支持对标有
IsReference=true
的对象进行序列化

这里有一个详细的演练:


谁能帮帮我吗?