2011-08-16 18 views
1

現在、すべてのオブジェクトには保存メソッドとロードメソッドが含まれています。これらのメソッドは、基本的にxmlドキュメントを作成しています。内部オブジェクトは、それぞれの保存メソッド(時にはそのインターフェイス)を使用してシリアル化されます。今私はいくつかのオブジェクトで異なるシリアル化を行うことが時々あります。 基本的に私はシリアライゼーションのあるバージョンから別のバージョンに移行したいと考えています。ポリモリックで拡張可能なシリアル化メソッドの実装方法

1つの方法は、クラス自体から独立したクラス(microsoftのxmlserializerのようなもの)に分離して機能を拡張することですが、オブジェクトの型がわからないときは、クラスまたはインタフェース。

XmlSerializerまたはDataContractSerializerを使用する以外の方法がありますか?

おかげで、 パベル

+0

基本タイプが不明な場合は、*具体的には*問題がありますか? –

+0

型が不明で、外部クラスで直列化が実行された場合、このクラスは直列化するすべてのメンバーを認識しない場合があります。 – PavelL

+0

「XmlSerializer」は、直列化するすべてのメンバーを「知っている」わけではありませんが、リフレクションと命令の組み合わせ(通常は属性を使用しますが、コードを使用することもできます)を使用して推論することができます。ここでは、 'new XmlSerializer(obj.GetType()) 'を使っただけで*ここでは*何も*働いていないなど、あなたが現在持っている問題を理解しようとしていますか? –

答えて

1

私は(コメント)を正しく理解していれば、あなたはそれぞれの実装が提供する既存の保存(...)メソッドを持っている - とSAVE2(...)を追加する必要はありません別のレイアウトの場合

この場合、新しいフォーマットを定義するものを単にパラメータとして追加します。それは複数のものを伴うことができれば(多分バージョン番号とフォーマットが)、私は、プロパティとしてそれらのものとSerializationContextようなクラスを作成し、既存の本を取るために保存し、変更となるすなわち

Save(..., SerializationContext ctx) 

既存のコードおそらくctxを無視しますが、必要に応じて、クラスはctx.Versionまたはctx.Formatなどを適切に動作するようにチェックすることができます。必要に応じて、後でSerializationContextに追加することもできます。

+0

ありがとう。はい、正しく理解しています。私はバージョンのチェックを避けることを望んでいたのは、同じブロックにsave2を追加するようなものだったからです。私は戦略か訪問者の設計のパターンのどちらかが私に役立つことができる場合再度チェックするつもりです。 – PavelL

関連する問題