gpt4 book ai didi

c# - 由于循环依赖导致序列化错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:21 24 4
gpt4 key购买 nike

我有一个自定义基类 Entity 装饰有 [DataContract(IsReference = true)] 并派生自 CSLA.netUndoableBase .保留 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

The IsReference setting for type 'Entity' is 'True', but the same setting for its parent class 'Csla.Core.UndoableBase' is 'False'. Derived types must have the same value for IsReference as the base type. Change the setting on type 'Entity' to 'False', or on type 'Csla.Core.UndoableBase' to 'True', or do not set IsReference explicitly.

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

Object graph for type 'XYZ' contains cycles and cannot be serialized if reference tracking is disabled.

现在我的问题是如何通过在序列化期间使用某些 API 更改 Csla.Core.UndoableBaseIsReference 设置来解决它。

在研究这个主题时,我看到了这篇关于使用 DataContractSurrogate 的帖子。如果在这种情况下有帮助,请帮助具体如何使用它,或者建议解决它的任何其他技术。

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

最佳答案

经过一番努力,我终于找到了这个问题的答案。有一个重载的构造函数,它采用 preserveObjectReferences 标志来指示序列化程序保留引用。在我的例子中,我现在已经从所有地方删除了 IsReference 注释,并使用下面的重载进行序列化,生活很好。

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

引用:Preserving Object Reference in WCF

关于c# - 由于循环依赖导致序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44738779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com