DataContractJsonSerializer可以处理循环引用吗?

时间:2013-11-14 10:45:28

标签: c# .net json datacontractserializer datacontractjsonserializer

是否存在DataContractSerializer 可以处理的序列化/反序列化方案,而DataContractJsonSerializer 不能

特别是,我正在考虑循环引用:this MSDN page解释了DataContractSerializer如何通过在IsReference = true构造函数中使用DataContractAttribute来管理循环引用。另一方面,DataContractAttribute.IsReference文档没有明确说明其适用性仅限于DataContractSerializer

DataContractJsonSerializer也会尊重IsReference属性吗?

1 个答案:

答案 0 :(得分:7)

下午没有像旧的动手测试那样......

在要序列化的类上应用DataContractAttribute.IsReference = true时,

[DataContract(IsReference = true)]
public class SerializableClass {
...
}

并尝试使用DataContractJsonSerializer

序列化它
var serializer = new DataContractJsonSerializer(typeof(SerializableClass));
serializer.WriteObject(stream, obj);

WriteObject方法将引发异常:

  

System.Runtime.Serialization.SerializationException:“SerializableClass”类型无法序列化为JSON,因为其IsReference设置为“True”。 JSON格式不支持引用,因为没有用于表示引用的标准化格式。要启用序列化,请在类型或相应类型的父类上禁用IsReference设置。

另一方面,如果我使用DataContractSerializer序列化同一个对象,序列化(和反序列化)就像魅力一样。

现在,如果有人知道DataContractJsonSerializerDataContractSerializer相比有更多限制,我会全力以赴......