C# EF DataContractSerializer异常

C# EF DataContractSerializer异常,c#,.net,wcf,entity-framework,datacontractserializer,C#,.net,Wcf,Entity Framework,Datacontractserializer,我在尝试序列化EF4 STE图时遇到了一个非常有趣的异常 System.IndexOutOfRangeException was caught Message=Index was outside the bounds of the array. Source=mscorlib StackTrace: Server stack trace: at System.Runtime.Serialization.Obj

我在尝试序列化EF4 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:最终使用中描述的方法调用重载的DataContractSerializer构造函数,并将preserveObjectReferences设置为true。这解决了问题,尽管我仍然无法解释

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


谢谢

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