XmlSerializer和工厂创建的元素

Oyv*_*ind 6 .net c# xml-serialization factory-pattern xmlserializer

我正在尝试序列化/反序列化具有工厂创建的成员的对象.例如,假设有一个类型的成员Foo,它使用FooFactory.CreateFoo(int bar)进行实例化.

我目前的想法是

1.创建自定义XmlReader(例如,从XmlTextReader派生),并将工厂附加到它

2.Implement IXmlSerializable

3.在ReadXml()中,我可以从读者手中抢到工厂.

不确定这是否是最优雅的方式,是否有人做过类似的尝试?

Mar*_*ell 6

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; }
     }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地转换FooFooDTO:

Foo foo = ...
FooDTO dto = foo;
Run Code Online (Sandbox Code Playgroud)