我有一个自定义基类Entity
用[DataContract(IsReference = true)]
装饰,并从csla.net的UndoableBase
派生。保留ISEREFERCE对于保留对象参考数据很重要。
[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
类型"实体"类型的质量设置为" true",但相同 设置其父级" csla.core.undoablebase"为" false"。 派生类型必须具有与基础相同的质量值 类型。将"实体"类型上的设置更改为" false"或类型 'csla.core.undoablebase'至" true"或不设置isReference 明确。
如果我完全删除此isReference属性,则我开始遇到以下错误:
类型" xyz"的对象图包含周期,不能序列化 如果禁用参考跟踪。
现在我的问题是如何通过使用一些API在序列化过程中更改IsReference
的CC_4设置来解决它。
在研究此主题时,我遇到了这篇文章,该帖子谈到了使用DataContractSurrogate
。如果在这种情况下有帮助或建议解决其他技术,请帮助如何特别使用它。
如何序列化的类,该类从用datacontract装饰(isReferend = true(的类中?
经过一场挣扎,我终于能够找到这个问题的答案。有一个超载的构造函数,它占用preserveObjectReferences
标志来指示序列化器保留参考。就我而言,我现在已经从各地删除了IsReference
注释,并在下面的过载以序列化和生命很好。
var serializer = new DataContractSerializer(typeof(T), knownTypes,
int.MaxValue /*maxObjectsInGraph*/,
false /*ignoreExtensionDataObject*/,
true /*preserveObjectReferences*/,
null /*dataContractSurrogate*/);
参考:在WCF