2

.NETXmlSerializerクラスを使用してXML文字列をStringWriterに書き込みます(WCFやJSON、またはサービスに関連するその他のものではありません)。

There was an error generating the XML document電話をかけた後の例外が発生した理由を何時間も調べた後XmlSerializer.Serialize()、私はついに循環参照が含まれていることを発見しました。私のクラスは次のようになります。

class Table
{
    public List<Columns> Columns {get; set;}
}

class Column
{
    public Table Table {get; set;}
}

ご覧のとおり、テーブルには列のコレクションがありますが、そのコレクションの各列には、その親テーブルへの参照も含まれています。

シリアル化中にプロパティを無視したくありません。逆シリアル化できるようにし、参照を再構築する必要がないようにしたい。私がWCFを使用していたとき、XMLのサイズを縮小するためにネットワーク全体で参照を保持する方法がありました。確かに、.NETは、XML自体の整合性を損なうことなく、循環関係をXMLにシリアル化する同様の方法を提供します。

4

1 に答える 1

4

いいえ、XmlSerializerこれはサポートされていません。あなたはWCFについて言及します:WCFは実際には使用しませんXmlSerializer(あなたのタイプがそのように明確にマークされていない限り)-それは使用することを好みDataContractSerializer、循環参照をサポートDataContractSerializer できますが、構築時にフラグを有効にするだけです:

var serializer = new DataContractSerializer(typeof(Foo),
    new DataContractSerializerSettings
{
    PreserveObjectReferences = true
});

DataContractSerializerSettingsこれは.NET4.5以降にのみ存在することに注意してください。それ以前は、コンストラクターのオーバーロード(preserveObjectReferencesパラメーター)でも同じことが利用できます。

XmlSerializerDataContractSerializerは1:1互換ではないことに注意してください。それらは多くの微妙な方法で異なった振る舞いをします。

于 2012-12-19T15:31:16.833 に答える