我想序列化有工廠創建的會員/反序列化對象。例如,假設有一個Foo
類型的成員,它使用FooFactory.CreateFoo(int bar)實例化。XmlSerializer的和工廠創建的元素
我現在的想法是
1.創建一個自定義的XmlReader(例如,從XmlTextReader的派生),工廠重視它
2.implement IXmlSerializable的
3.in的ReadXml (),我可以從閱讀器抓住工廠。
不知道這是最優雅的方式來做到這一點,有沒有人做過類似的嘗試?
我想序列化有工廠創建的會員/反序列化對象。例如,假設有一個Foo
類型的成員,它使用FooFactory.CreateFoo(int bar)實例化。XmlSerializer的和工廠創建的元素
我現在的想法是
1.創建一個自定義的XmlReader(例如,從XmlTextReader的派生),工廠重視它
2.implement IXmlSerializable的
3.in的ReadXml (),我可以從閱讀器抓住工廠。
不知道這是最優雅的方式來做到這一點,有沒有人做過類似的嘗試?
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;
謝謝,DTO似乎是去這裏的路! :) – Oyvind