【发布时间】: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