如何使用XmlSerializer反序列化为现有实例?

Mar*_*tin 6 .net c# serialization .net-2.0

是否有可能使用XmlSerializer将其数据反序列化为现有的类实例而不是新的实例?

这在两种情况下会有所帮助:

  1. 轻松将两个XML文件合并到一个对象实例中.
  2. 让object constructer本身就是从XML文件加载其数据的人.

如果默认情况下不可能,它应该使用反射(在反序列化后复制每个属性),但这将是一个丑陋的解决方案.

Mar*_*ell 5

基本上,你不能。XmlSerializer是严格的建设性的。您可以进行自定义的唯一有趣的事情XmlSerializer是自己实现IXmlSerializable并完成所有操作 - 这不是一个有吸引力的选项(并且它仍然会使用默认构造函数等创建新实例)。

xml要求严格吗?如果您可以使用不同的格式,protobuf-net支持将片段合并到现有实例中,如下所示:

Serializer.Merge(source, obj);
Run Code Online (Sandbox Code Playgroud)


Tib*_*Ana 1

我认为你的反思想法是正确的。

由于您可能有一个围绕 XML 操作的包装器,因此您可以接收目标对象,通常将反序列化到一个新对象中,然后通过仅一一复制包含非默认值的属性来执行类似于克隆的操作。

实现它不应该那么复杂,它会像就地反序列化一样从应用程序的其余部分寻找消费者。