由于循环依赖性引起的序列化错误



我有一个自定义基类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

中保存对象参考

相关内容

  • 没有找到相关文章

最新更新