.NET类Xml序列化时XmlAttribute顺序异常:16个正常17个错乱
.NET XmlSerializer序列化17个XmlAttribute时属性顺序错乱问题
我有一个.NET类,其中多数公共属性标记了[XmlAttribute]特性。当类包含16个XmlAttribute属性时,序列化后的XML属性顺序完全符合类中定义的顺序;但增加到17个时,顺序出现异常:原本处于倒数第3、4位的属性被移到了XML元素的开头,而类里定义的前两个XmlAttribute属性(Id、Name)被换到了倒数第3、4位的位置。即使调整类内部的属性定义顺序,也只会出现这两组属性的位置交换问题。
代码示例
class Market { [XmlArray(Order = 0)] [XmlArrayItem(IsNullable = false)] public List<Option> Options { get; set; } [XmlElement(Order = 1)] public MarketType MarketType { get; set; } [XmlAttribute] public int Id { get; set; } [XmlAttribute] public string Name { get; set; } [XmlAttribute] public bool IsEnabled { get; set; } // ... 此处省略剩余14个XmlAttribute属性,总计17个 }
正常序列化结果(16个XmlAttribute属性)
<Market Id="10" Name="Test" IsEnabled="false" ... a="" b="" c="" d="">
异常序列化结果(17个XmlAttribute属性)
<Market b="" a="" IsEnabled="false" ... Name="Test" Id="10" c="" d="">
解决方法
XmlSerializer在处理未指定Order的属性时,依赖.NET反射获取的属性顺序。而当类中的属性数量超过16个时,反射内部会改用哈希表存储属性信息,导致返回的顺序不再固定,进而引发序列化顺序错乱。
要彻底解决这个问题,给每个[XmlAttribute]特性显式指定Order参数,明确每个属性的序列化顺序:
[XmlAttribute(Order = 2)] public int Id { get; set; } [XmlAttribute(Order = 3)] public string Name { get; set; } [XmlAttribute(Order = 4)] public bool IsEnabled { get; set; } // 剩余属性依次指定连续的Order值 [XmlAttribute(Order = 5)] public string A { get; set; } [XmlAttribute(Order = 6)] public string B { get; set; } // ... 最后一个属性指定Order = 18(前面XmlArray为0,XmlElement为1,所以XmlAttribute从2开始到18共17个)
通过显式指定Order,无论类中属性数量多少,XmlSerializer都会严格按照指定的顺序生成XML属性。
内容的提问来源于stack exchange,提问作者Mohini Mhetre
相关产品推荐
相关产品推荐

