2009-03-13 13 views
10

クラスにIXmlSerializableを実装して、ReadXmlまたはWriteXmlのどちらかをオーバーライドしたいだけですが、両方をオーバーライドしないでください。このクラスにIXMLSerializableを実装しなかった場合、XMLSerializerは自動的にすべてのメンバーを直列化します。私はそのデフォルトの動作をオーバーライドされていないケースに適用したいと思います。しかし、IXmlSerializableは基本クラスではなくインターフェースなので、どうやってそれをどうやって進めるのかは分かりません。IXmlSerializableを実装するとき、ReadXmlまたはWriteXmlのどちらかをオーバーライドするだけで、両方をオーバーライドする方法はありませんか?

また、あるケースではデフォルトの動作を行う必要があり、完了したら追加のコードを追加する必要があります。だから、私はオーバーライドして、 '基本'クラスの動作に戻ってコールしたいと思います。ここでも基本クラスがあればこれは簡単ですが、これはインターフェースなので簡単なことではありません。

ありがとうございます!

答えて

4

シリアル化/デシリアライズの前後でアクションを実行する機能は、属性で提供されます。ただこの方法は、右の署名があることを確認、それはインスタンスが直列化復元された後に呼び出されるためOnDeserializedAttributeを持つメソッドをマーク:

[OnDeserializedAttribute()] 
private void RunThisMethod(StreamingContext context) { 
    // ... 
} 

NBを。この属性は、バイナリ、SOAPおよびDataAttributeフォーマッタで機能しますが、ではなく、XmlSerializerの場合はです。 IXmlSerializableの実装以外の属性やメカニズムはありません。

また、XMLドキュメントを直接読み込み、(de)シリアライズするコードを書くことができることを忘れないでください。


オリジナルの答え:あなたは完全にシリアライズまたはデシリアライゼーションの1を(上書きので、あなたは両方を自分で行う必要があり、その後IXmlSerializableを実装する必要がある場合は

それを作ることも可能である属性と他の使用。 IXmlSerializableを使用して回避するためのメカニズム、あなたはただ1 ReadXmlまたはWriteXmlのを実装する必要があります。

+0

これは奇妙なニーズです。特定のクラスを逆シリアル化したら、新しく作成したインスタンスを登録する必要があります。だから、私は望んでいた:(1)シリアライズをそのままにし、(2)デシリアライズをオーバーライドし、自分の登録コードを追加する。 – Eric

+0

XMLシリアライザに適用されるOnDeserializedAttributeと同等のものが必要ですか? – Richard

+0

OnDeserializedがトリックを行います!これをテキストにコピーして、これを回答としてマークします。 – Eric

1

両方の方法を実装する必要がありますが、それはあなたの責任の全範囲です(コンパイラに関する限り)。 nullを返すか、使用しないメソッドで例外をスローすることができます。

EDIT

I'd like the default behavior to apply for the non-overridden case.

何デフォルトの動作では、あなたが参照していますか?インターフェイスを実装しているので、既定の動作はありません。

+0

私はこのCLASにIXMLSerializableを実装しなかった場合はなぜの詳細と質問を拡大することができXMLSerializerは自動的にすべてのメンバーをシリアライズします。それが私が探している「デフォルト」の動作です。 – Eric

+0

サポートされていないメソッドにNotSupportedExceptionをスローする可能性があります。 –

関連する問題