C# 由于循环依赖关系,序列化时出错
我有一个定制的基类C# 由于循环依赖关系,序列化时出错,c#,datacontractserializer,datacontract,csla,datacontractsurrogate,C#,Datacontractserializer,Datacontract,Csla,Datacontractsurrogate,我有一个定制的基类实体用[DataContract(IsReference=true)]修饰,并从。保持IsReference对于保留对象引用数据很重要 [Serializable] [DataContract(IsReference = true)] public abstract class Entity : UndoableBase 我在使用以下代码段进行序列化时遇到异常: public void SerializeToFile(string fileName, T obj) {
实体
用[DataContract(IsReference=true)]
修饰,并从。保持IsReference对于保留对象引用数据很重要
[Serializable]
[DataContract(IsReference = true)]
public abstract class Entity : UndoableBase
我在使用以下代码段进行序列化时遇到异常:
public void SerializeToFile(string fileName, T obj)
{
_serializer = new DataContractSerializer(typeof(T));
Serialize(fileName, obj);
}
private void Serialize(string fileName, T obj)
{
using (var fs = File.Open(fileName, FileMode.Create))
{
_serializer.WriteObject(fs, obj);
fs.Close();
}
}
System.Runtime.Serialization.InvalidDataContractException
类型“Entity”的IsReference设置为“True”,但相同
其父类“Csla.Core.UndoableBase”的设置为“False”。
派生类型的IsReference值必须与基类型的IsReference值相同
类型。将类型“Entity”的设置更改为“False”,或更改类型“Entity”的设置
将“Csla.Core.UndoableBase”设置为“True”,或不设置IsReference
明确地说
如果完全删除此IsReference属性,则会出现以下错误:
类型“XYZ”的对象图包含循环,无法序列化
如果参考跟踪被禁用
现在我的问题是如何通过在使用一些API进行序列化期间更改Csla.Core.UndoableBase
的IsReference
设置来解决这个问题
在研究这个主题时,我看到了这篇文章,它讨论了如何使用datacontractsrogate
。如果它在这种情况下有帮助,请帮助具体如何使用它,或者建议解决它的任何其他技术
经过一番努力,我终于找到了这个问题的答案。有一个重载构造函数,它使用
preserveObjectReferences
标志指示序列化程序保留引用。在我的例子中,我现在已经从所有地方删除了IsReference
注释,并在下面的重载中使用它来进行序列化,这样生活就好了
var serializer = new DataContractSerializer(typeof(T), knownTypes,
int.MaxValue /*maxObjectsInGraph*/,
false /*ignoreExtensionDataObject*/,
true /*preserveObjectReferences*/,
null /*dataContractSurrogate*/);
参考资料:我不确定DataContractSurrogate是否能在这里帮助您。究竟是什么导致了图形中的循环引用:您是否识别出了这一点?根据我的经验,有时甚至不需要循环引用。你是对的,但在我的例子中,循环依赖确实存在,因为我有一种类型,我通过公开相同类型的父属性来保持父子关系。