2

我有一个用CSLA.netEntity装饰[DataContract(IsReference = true)]和派生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

“Entity”类型的 IsReference 设置为“True”,但其父类“Csla.Core.UndoableBase”的相同设置为“False”。派生类型的 IsReference 值必须与基类型相同。将“Entity”类型的设置更改为“False”,或将“Csla.Core.UndoableBase”类型的设置更改为“True”,或者不明确设置 IsReference。

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

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

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

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

如何序列化派生自用 DataContract(IsReference=true) 装饰的类的类?

4

1 回答 1

1

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

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

参考:在 WCF 中保留对象引用

于 2017-06-28T16:47:20.753 回答