序列化时在 xml 架构 class 中重命名 属性

rename property in xml schema class when serializing

我有一个使用 xsd 生成器工具从 xml 模式自动生成的 c# class 文件。

这个 class 中有一个 属性,我需要在创建 xml 文件时将其从 "Balance" 重命名为 "balance"。

因为这是一个生成的 class 我需要在序列化之前动态更新创建的 xml 对象所以不能只在 class 属性 上添加一个属性使用预期的名称。

我已经通过使用 XmlAttributes class 完成了忽略某些属性的任务,所以我确信我可以为此做一些相同的事情

任何人都可以指出如何实现这一目标的方向吗?

谢谢

假设您需要像这样从 XML 反序列化:

<root>
  <Balance />
</root>

然后像这样序列化为XML:

<root>
  <balance />
</root>

这里有两个选择:

  1. 您可以创建第二个 class,它以各种方式反映您自动生成的 class,除了 [XmlElement("balance")] 上的余额 属性 在镜像 class 中。如果生成的 class 是 XsdGenerated 而镜像的 class 是 CustomClass,则创建构造函数或覆盖 =s 运算符以能够填充 CustomClass 以及 XsdGenerated 中的所有字段。当您序列化 CustomClass 时,您应该会得到想要的结果。我认为这是更好的选择。

  2. XsdGenerated 上实施 IXmlSerializable。在 ReadXml 方法中调用 base(),然后让 WriteXml 方法创建小写的 balance 标签。请注意,此选项可能对 write/maintain 更具挑战性,并且会限制您序列化和反序列化的能力 - 这将是一种单向操作,除非您创建了一个更复杂的机制来设置 ReadXml()WriteXml() 应该用大写或小写 b 来对待 balance

我已经通过以下方式解决了我的问题:

var overrides = new XmlAttributeOverrides();  

overrides.Add(typeof(MyGeneratedCustomType), "Balance", new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("balance") });

var serializer = new XmlSerializer(xmlFile.GetType(), overrides);

MyGeneratedCustomType 是出现在生成的 xsd class 中的一种类型,它包含我需要重命名的 属性。这是一个优雅的解决方案,因为需要的代码非常少。