2009-09-04 10 views
2

.NETシリアル化クラスを使用して、アプリケーションの特定の関数に渡す引数値をシリアル化してログに記録しています。このためには、パスを取得するすべてのクラスのプロパティ値をXMLにシリアル化する手段が必要ですが、はXMLをシリアル化できないプロパティ(たとえば、Imageのプロパティ)を無視します。XMLシリアル化を使用して自動的に非シリアル化可能なプロパティを無視する

私はクラスを通過して[XmlIgnore]属性でそのようなプロパティをマークできますが、理想的にはそのようなプロパティをスキップするシリアライザが必要です。

これは達成可能ですか?

答えて

2

XmlAttributeOverridesオブジェクトを動的に作成して、関連するプロパティにXmlIgnore属性を追加することができます。特定の型がXMLシリアル化に適しているかどうかを判断するロジックを実装し、オブジェクトグラフを再帰的に参照するだけで済みます。 XmlAttributeOverridesオブジェクトの作成が完了したら、XmlSerializerコンストラクタに渡します。

0

これはおそらくあなたの "XMLIgnore"アイデアほど効率的ですが、XPathを使ってシリアライズ可能な部分をserialize関数に渡すことができます。

0

共通の基底クラスを制御する場合、これをリフレクションで実装できます。そうしないと、面倒です。カスタムXmlシリアル化スキームを実装することができます。それはそれほど難しいことではありませんが、価値があるとは思えません。

また、すべてのクラスの直列化不可能なプロパティを無視する場合は、レベルを考慮する必要があります。それ以外の場合は、以前は直列化不可能なクラスが直列化可能になりますが、 (完全に)シリアライズ可能ではありません。

0

XmlSerializerをサブクラス化し、仮想保護されたSerialize(オブジェクト、XmlSerializationWriter)メソッドをオーバーライドする必要があります。おそらく、独自のXmlSerializationWriterを実装する必要があります。

幸運を祈る!

編集:下記のThomasのコメントを確認してください。彼は正しいと思う。

+1

私はそのルートに対してアドバイスをします.XmlSerializerは直接シリアル化を実行せず、別のアセンブリを生成します。だから、シリアライズアセンブリが生成される方法を変えなければならないでしょう。それはかなり難しいかもしれません... –

関連する問題