XmlSerializer和工厂创建的元素
本文关键字:元素 创建 工厂 XmlSerializer | 更新日期: 2023-09-27 18:15:14
我正在尝试序列化/反序列化具有工厂创建成员的对象。例如,假设有一个类型为Foo
的成员,它使用FooFactory实例化。CreateFoo (int酒吧)。
我现在的想法是
1。创建自定义XmlReader(例如,从XmlTextReader派生),并将工厂附加到其上
2。实现IXmlSerializable
3。在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;