2011-11-21 10 views
5

工場で作成したメンバを持つオブジェクトをシリアル化/逆シリアル化しようとしています。たとえば、タイプFooのメンバーがあり、FooFactory.CreateFoo(int bar)を使用してインスタンス化されているとします。XmlSerializerと工場作成の要素

私の現在の考えは

1.createカスタムたXmlReader(例えば、XmlTextReaderクラスから派生)にあり、そしてそれに工場を添付

2.implement IXmlSerializable

3.in ReadXmlの説明()、私はリーダーから工場をつかむことができます。

これが最もエレガントな方法であるかどうかは不明ですが、誰も同様の試みをしましたか?

答えて

5

XmlSerializerは設定されていません。 XmlSerializerを使用する場合は、より簡単なDTOモデルに最初のにデータをマップし、にシリアライズすることをお勧めします。コードをDTOからモデルに書き戻すときは、ファクトリの作成を通常のコードで追加します。 DTOモデルはシンプルでなければなりません。 XmlSerializerが簡単で十分ですIXmlSerializableを実装

はい

は、しかし、オプション 次のとおりです。そのAPIは、(XMLがそれに見えることができ、すべてのさまざまな方法を処理するために)100%の権利を取得することは非常に難しいです。そのAPIは非常に難しく、多くのシリアル化が行われています。私は、メインのモデルをDTOモデルにマップするコードをいくつか書くことは、IXmlSerializableを実装しようとするよりはるかに頑丈で(そしてもっと速く)書けることを謙虚に提出しています。

たとえば、あなたが持っている可能性があり:

[XmlRoot("foo")] 
public class FooDTO { 
    [XmlAttribute("bar")] 
    public int Bar {get;set;} 

    public static implicit operator Foo(FooDTO value) 
    { 
     return value == null ? null : FooFactory.Create(value.Bar); 
    } 
    public static implicit operator FooDTO(Foo value) 
    { 
     return value == null ? null : new FooDTO { Bar = value.Bar; } 
    } 
} 

その後、あなたは、単にによってFooDTOFooから変換することができます:

Foo foo = ... 
FooDTO dto = foo; 
+0

おかげで、DTOはここに移動するための方法のようです! :) – Oyvind

関連する問題