You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:23