【问题标题】:EF DataContractSerializer ExceptionEF DataContractSerializer 异常
【发布时间】:2012-02-21 13:02:31
【问题描述】:

我在尝试序列化 EF 4 STE 图表时遇到了一个非常有趣的异常。

      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)

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

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() 扩展方法,一切都可以序列化。

有没有其他人遇到过这样的事情?可能是什么原因造成的?关于如何追捕罪魁祸首的任何想法?

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

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

更新 3:最终使用 this article 中描述的方法调用重载的 DataContractSerializer 构造函数,并将 preserveObjectReferences 设置为 true。这解决了这个问题,虽然我仍然无法解释它......

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

谢谢!

【问题讨论】:

    标签: c# .net wcf entity-framework datacontractserializer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多