【问题标题】:Error on serialization due to circular dependency由于循环依赖导致的序列化错误
【发布时间】:2017-06-24 16:54:08
【问题描述】:

我有一个自定义基类Entity 装饰有[DataContract(IsReference = true)] 并派生自UndoableBase 的CSLA.net。保留 IsReference 对保留对象引用数据很重要。

[Serializable]
[DataContract(IsReference = true)]
public abstract class Entity : UndoableBase

我在使用以下代码 sn-p 进行序列化时遇到异常:

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 值必须与基类型相同 类型。将类型“实体”的设置更改为“假”,或类型 'Csla.Core.UndoableBase' 为 'True',或不设置 IsReference 明确的。

如果我完全删除这个 IsReference 属性,我会开始收到以下错误:

“XYZ”类型的对象图包含循环,无法序列化 如果参考跟踪被禁用。

现在我的问题是如何在序列化过程中使用一些 API 更改 IsReference 的 IsReference 设置来解决它。

在研究这个主题时,我偶然发现了这篇文章,其中谈到了使用 DataContractSurrogate。如果在这种情况下有帮助,请帮助具体如何使用它或建议任何其他解决它的技术。

How to serialize class that derives from class decorated with DataContract(IsReference=true)?

【问题讨论】:

  • 我不确定 DataContractSurrogate 是否会在这里为您提供帮助。究竟是什么导致了图表中的循环引用:您确定了吗?根据我的经验,有时甚至不需要循环引用。
  • 你是对的,但在我的情况下,循环依赖确实存在,因为我有一个类型,我通过公开相同类型的 Parent 属性来保留父子关系。

标签: c# datacontractserializer datacontract csla datacontractsurrogate


【解决方案1】:

经过一番挣扎,我终于找到了这个问题的答案。有一个重载的构造函数,它采用preserveObjectReferences 标志来指示序列化程序保留引用。就我而言,我现在已经完全删除了 IsReference 注释,并在重载下使用了序列化,并且生活很好。

var serializer = new DataContractSerializer(typeof(T), knownTypes,
            int.MaxValue /*maxObjectsInGraph*/,
            false /*ignoreExtensionDataObject*/,
            true /*preserveObjectReferences*/,
            null /*dataContractSurrogate*/);

参考:Preserving Object Reference in WCF

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多