由于循环依赖导致序列化错误
Error on serialization due to circular dependency
我有一个自定义基础 class Entity
,用 [DataContract(IsReference = true)]
装饰并派生自 CSLA.net 的 UndoableBase
。保留 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.UndoableBase
的 IsReference
设置来解决它
在研究这个主题时,我遇到了这个 post,它讨论了如何使用 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*/);
我有一个自定义基础 class Entity
,用 [DataContract(IsReference = true)]
装饰并派生自 CSLA.net 的 UndoableBase
。保留 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.UndoableBase
的 IsReference
设置来解决它
在研究这个主题时,我遇到了这个 post,它讨论了如何使用 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*/);