2011-11-21 42 views
5

我想序列化有工廠創建的會員/反序列化對象。例如,假設有一個Foo類型的成員,它使用FooFactory.CreateFoo(int bar)實例化。XmlSerializer的和工廠創建的元素

我現在的想法是

1.創建一個自定義的XmlReader(例如,從XmlTextReader的派生),工廠重視它

2.implement IXmlSerializable的

3.in的ReadXml (),我可以從閱讀器抓住工廠。

不知道這是最優雅的方式來做到這一點,有沒有人做過類似的嘗試?

回答

5

XmlSerializer根本沒有設置爲。我強烈建議,如果你想使用XmlSerializer,你最好的選擇將是您的數據映射到一個簡單的DTO模式第一,和序列化。將代碼從DTO寫回到模型時,請使用常規代碼在處添加工廠創建。 DTO模型應該很簡單;對於XmlSerializer來說很簡單,對它感到滿意。

是,實施IXmlSerializable一個選項,但是:該API是非常很難獲得100%正確的(處理所有的各種方式的XML可以出現的話)。我發現這個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; } 
    } 
} 

,那麼你可以簡單地從Foo轉換爲FooDTO

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

謝謝,DTO似乎是去這裏的路! :) – Oyvind