【发布时间】: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