4

私は現在XmlSerializer、驚くべきことに:)、データ構造の逆シリアル化を処理するために使用しています-使用するのは非常に簡単ですが、柔軟性が犠牲になっています。現時点では、ツリーベースの構造に使用しています。はXmlSerializer循環構造を処理しない[XmlIgnore]ため、Parentプロパティに追加し、ツリーに対してデシリアライゼーション後の反復を実行して、ノードの親を修正しました。

を使用してこれを処理するより良い方法はありますXmlSerializerか、または を使用してコードを書き直す方がよいでしょうXmlReader/XmlWriterか? 実装IXmlSerializableはうまくいくと思いますが、かなりの量の作業のように思えますが、XmlSerializer.

現在のデシリアライゼーション後の手順は問題ありませんが、別の XML ファイルにシリアライズする必要があるデータ構造を追加しています。基本的には、前のツリー構造のノードを参照する Parent プロパティを必要とする項目のフラット リストです。これには、デシリアライゼーション後の手順が必要であり、Parent 属性と ParentId (またはいくつかのトリック) の両方を新しいデータ構造に保持する必要があります。

では、スマートな (そして壊れにくい) アイデアはありますか? それともXmlReader/XmlWriterそうですか?

解決

DataContractSerializerXmlSerializer とほぼ同じシンプルさで、かなりまともなソリューションであることが判明しました。自動サイクル処理を使用しないことにしましたが、代わりに、親ノードの設定を処理するOnDeserialized装飾メソッドを定義して使用しました。そうすれば、生成された XML は標準に準拠しています。

しばらく私を混乱させたことの 1 つは、バッキング メンバーが null に設定されている状態で、デシリアライズ後にいくつかのプロパティでクラッシュが発生したことでした。デバッグすると、コンストラクターが呼び出されないことが示されました。いくつかのグーグル検索の後、説明付きのこの SO 投稿を見つけました。

4

2 に答える 2

1

バイナリ シリアライゼーション (BinarySerializer または DataContractSerializer) を試すことができます。これは、人間が判読できるデータ表現を持たないという犠牲を払って、循環グラフをいくらかうまく処理できると思います。または、こちらで詳しく説明されている SoapFormatter を試すこともできます。

于 2010-08-26T18:08:26.503 に答える
1

を使用しDataContractSerializerます。クラスを でマークします[DataContract(IsReference = true)]

于 2010-08-26T18:22:28.170 に答える