EF 4 STEのグラフをシリアル化しようとしているときに非常に興味深い例外が発生しました。EF DataContractSerializer例外
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:preserveObjectReferencesをtrueに設定して、オーバーロードされたDataContractSerializerコンストラクターを呼び出すには、this articleに記載されている方法を使用して終了しました。私はまだそれを説明することはできませんが、これは...、
を問題を修正しましたので、多分、今、私の質問は次のようになります。DataContractSerializerのpreserveObjectReferencesがすべてで[のDataContract(IsReference =真)]を持つと異なる方法STEさん?
ありがとうございました!