gpt4 book ai didi

c# - XmlSerializer 和工厂创建的元素

转载 作者:太空狗 更新时间:2023-10-29 21:35:52 25 4
gpt4 key购买 nike

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

我目前的想法是

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

2.实现IXmlSerializable

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

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

最佳答案

XmlSerializer 根本没有为此设置。我强烈建议,如果您想使用 XmlSerializer,最好的办法是首先将您的数据映射到更简单的 DTO 模型,然后序列化那个。将代码从 DTO 写回您的模型时,以常规代码将工厂创建添加到那里。 DTO模型应该很简单;简单到足以让 XmlSerializer 满意。

是的,实现 IXmlSerializable一个选项,但是:该 API 非常很难做到 100% 正确(处理所有各种xml 的显示方式)。我发现那个 API 很难,我做了很多序列化。我谦虚地提出,编写几行代码以从您的 main 模型映射到 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;

关于c# - XmlSerializer 和工厂创建的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8211777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com