【问题标题】:XML Deserialization - convert attribute value into class automatically (.net)XML 反序列化 - 自动将属性值转换为类 (.net)
【发布时间】:2025-12-23 03:55:12
【问题描述】:

(vb.net/c#/etc)

我无法弄清楚如何做一些反序列化魔法。目前标准的反序列化工作正常,包括枚举,但是现在我想将一个属性转换为一个类。哦!我在想什么

我的 xml 看起来有点像这样:

....
<review user="..." version="2.2">...</review>

这适用于我的财产/班级:

[XmlAttribute("version")]
public MyVersion Version { get; set; }

class MyVersion  {
    // equality overloaded
    // can ctype() from string to MyVersion
    // constructor that takes a single string, etc
}

如何帮助序列化程序,以便它可以自动将我的字符串属性反序列化到这个类中?我是否需要以某种方式修改 MyVersion 类,或者更改属性的定义?

  • 我确实想要重写任何方法,如 OnDeserialized 等。对于这个项目来说,这是不值得的。

如果使用默认的 xml 反序列化器无法做到这一点,那么知道这一点就足够了。它有很多不好的地方,所以我不会感到惊讶。

谢谢!

【问题讨论】:

    标签: .net xml-serialization


    【解决方案1】:

    声明方式不支持此功能。您必须在父类(序列化为元素的类)上实现 IXmlSerializable 并手动执行字符串和 MyValue 类型之间的转换。

    【讨论】:

      【解决方案2】:

      您可以很容易地做到这一点 - 只是不是作为反序列化操作。

      使用 XSD 创建您的反序列化类。现在这些都是部分类,因此您可以编写评论类的新部分(包含属性“版本”)并添加一个获取/设置版本的方法。

      在 get 方法中简单地创建该类的新实例,并在 set 方法中简单地从提供的版本类更新现有版本。

      【讨论】:

      • 是的,我可以将其作为新属性进行。只是试图找到一种声明性(且简单)的方法来解决它,因为我无法将该属性(任何人都不应使用)设为私有,否则默认序列化将不起作用。