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是否能在这里帮助您。究竟是什么导致了图形中的循环引用:您是否识别出了这一点?根据我的经验,有时甚至不需要循环引用。你是对的,但在我的例子中,循环依赖确实存在,因为我有一种类型,我通过公开相同类型的父属性来保持父子关系。