2011-11-21 75 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