首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF DataContractSerializer异常

EF DataContractSerializer异常
EN

Stack Overflow用户
提问于 2012-02-21 13:02:31
回答 1查看 899关注 0票数 2

我遇到了一个非常有趣的例外,当我试图序列化一个图的EF 4 STEs。

代码语言:javascript
复制
      System.IndexOutOfRangeException was caught
      Message=Index was outside the bounds of the array.
      Source=mscorlib
      StackTrace:
        Server stack trace: 
           at System.Runtime.Serialization.ObjectReferenceStack.EnsureSetAsIsReference(Object obj)
           at System.Runtime.Serialization.XmlObjectSerializerWriteContext.OnHandleIsReference(XmlWriterDelegator xmlWriter, DataContract contract, Object obj)
           at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
           ...
           at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)
           at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph)

我的序列化代码相当简单:

代码语言:javascript
复制
using (MemoryStream memoryStream = new MemoryStream())
{
    DataContractSerializer dc = new DataContractSerializer(data.GetType());
    dc.WriteObject(memoryStream, data);

    memoryStream.Flush();

    memoryStream.Position = 0;
    StreamReader reader = new StreamReader(memoryStream);
    var serializedObject = reader.ReadToEnd();
}

在我的对象图中,我向父实体添加了几个子实体,并且我发现如果调用父实体上的.AcceptChanges()扩展方法,一切都会很好地序列化。

还有其他人遇到过这样的事吗?是什么引起的?有什么办法能找到罪魁祸首?

更新:我发现了一个链接,其他人也有类似的问题。他们说,System.Runtime.Serialization.ObjectReferenceStack.EnsureSetAsIsReference)正在做一些循环验证,可能会发现一个问题。

更新2:我还发现在DataContractSerializer的构造函数中将DataContractSerializer设置为true可以清除异常。

更新3:最后使用这篇文章中描述的方法调用重载的DataContractSerializer构造函数,并将preserveObjectReferences设置为true。这解决了问题,虽然我还是无法解释.

所以,也许现在,我的问题变成了: preserveObjectReferences on DataContractSerializer与在所有STE的上有DataContract(IsReference = true)有什么不同?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-04-10 14:58:36

PreserveObjectReferences似乎对所有类都使用了“非标准的XML构造”,而isReference是标准的SOAP方式,但是需要在需要它的每个类上声明它。我也有同样的问题,这是因为我错过了一些课程。常见的陷阱是DataContractAttribute不是继承的,所以您必须为每个继承的类重新声明它(用IsReference=true)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9378081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档