使用 XmlSerializer 序列化 C# 类时,表示类属性的属性/元素将与源代码中的名称相同。
我知道你可以通过这样做来覆盖它:
[XmlAttribute("num")]
public int NumberOfThingsThatAbcXyz { get; set; }
我希望为我的类生成的 XML 尽可能紧凑,但显然仍然能够在另一端自动反序列化。
有没有办法尽可能地缩小这些名称,而不必手动考虑并用短字符串注释所有内容?生成的 XML 易于人类阅读不是问题。
使用 XmlSerializer 序列化 C# 类时,表示类属性的属性/元素将与源代码中的名称相同。
我知道你可以通过这样做来覆盖它:
[XmlAttribute("num")]
public int NumberOfThingsThatAbcXyz { get; set; }
我希望为我的类生成的 XML 尽可能紧凑,但显然仍然能够在另一端自动反序列化。
有没有办法尽可能地缩小这些名称,而不必手动考虑并用短字符串注释所有内容?生成的 XML 易于人类阅读不是问题。
嗯,请注意这样的微优化。用现代计算硬件让他们得到回报是非常困难的。处理 XML 所涉及的 I/O 的真正成本不是数据量,而是定位数据。字节很便宜,传输它们已经高度优化。它是一个磁盘驱动器读头在某处的服务器上磨掉,也许在你自己的机器上,它决定了你的程序运行的速度。一旦它在正确的位置,读取一个字节几乎和读取一个千字节一样昂贵。内存的工作方式相同。
最终提示:如果这是一个常见的优化,他们会想出比 IXmlSerializable 更好的东西。
为了自定义 XML 序列化超出您可以通过使用属性执行的操作,您将需要您的类来实现IXmlSerializable接口。
如果人类可读性不是问题......为什么要使用 xml - 也许像“协议缓冲区”(有可用的 C# 实现)之类的东西会给您提供所需级别的互操作性而不会出现这个问题,包括一些获得所有自动属性(如果您有兴趣,我可以讨论更多)。
另一种选择是简单地 gzip 数据;由于所有重复的节点名称,xml 压缩得非常好。
The nature of attributes implies that this can't be done. See can-attributes-be-added-dynamically-in-c# for why. Even if it could be done, I agree with Hans that it probably isn't worth it. If you are really concerned about this then you should go with one of Marc's suggestions.