EF DataContractSerializer Exception
本文关键字:Exception DataContractSerializer EF | 更新日期: 2023-09-27 18:25:13
我在尝试序列化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()扩展方法,一切都会串行化。
其他人遇到过这样的事情吗?是什么原因造成的?有什么办法可以找到罪犯吗?
更新:我发现了一个其他人也有类似问题的链接。他们说System.Runtime.Serialization.ObjectReferenceStack.EnsureSetAsIsReference)正在进行一些循环验证,可能会发现问题。
更新2:我还发现,在DataContractSerializer的构造函数中将preserveObjectReferences设置为true可以清除异常。
更新3:最终使用本文中描述的方法调用了preserveObjectReferences设置为true的重载DataContractSerializer构造函数。这解决了问题,尽管我仍然无法解释…
所以,也许现在,我的问题变成了:在DataContractSerializer上的preserveObjectReferences与在所有STE上使用[DataContract(IsReference=true)]有何不同
谢谢!
看起来PreserveObjectReferences对所有类都使用"非标准XML构造",而isReference是标准的SOAP方式,但它需要在每个需要的类上声明。我也有同样的问题,那是因为我错过了把它放在一些课上。常见的陷阱是DataContractAttribute不是继承的,因此必须为每个继承的类重新声明它(IsReference=true)。