我想序列化有工厂创建的会员/反序列化对象。例如,假设有一个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