2012-02-21 13 views
2

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さん?

ありがとうございました!

答えて

1

PreserveObjectReferencesはすべてのクラスに対して「非標準XML構造」を使用しているようですが、isReferenceは標準のSOAP方法ですが、必要なすべてのクラスで宣言する必要があります。私は同じ問題を抱えていました。なぜなら、私はそれをいくつかのクラスに載せていなかったからです。 一般的なトラップはDataContractAttributeが継承されないため、継承された各クラスに対して(IsReference = trueで)再宣言する必要があります。

関連する問題