XmlSerializer和工厂创建的元素

本文关键字:元素 创建 工厂 XmlSerializer | 更新日期: 2023-09-27 18:15:14

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

我现在的想法是

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

2。实现IXmlSerializable

3。在ReadXml()中,我可以从阅读器中获取工厂。

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

XmlSerializer和工厂创建的元素

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;