继承基类的扩展类XML序列化顺序异常,求简易解决方案
解决Xml序列化继承类属性顺序问题的简便方案
XmlSerializer默认会先序列化基类的所有属性,再处理子类属性,因此即使子类属性指定了更小的Order值,也会排在基类属性之后。无需自定义序列化器,有两种简便方法可以解决:
方法一:子类重新声明基类属性并指定顺序
在子类中使用new关键字重新声明基类的属性,同时保留或调整XmlElement的Order值,这样XmlSerializer会优先使用子类中声明的属性,从而按指定顺序输出。
修改后的代码:
public class BaseClass { [XmlElement("B", Order = 2)] public string? B { get; init; } [XmlElement("C", Order = 3)] public string? C { get; init; } } public class ExtClass : BaseClass { [XmlElement("A", Order = 1)] public string? A { get; init; } [XmlElement("B", Order = 2)] public new string? B { get; init; } [XmlElement("C", Order = 3)] public new string? C { get; init; } }
序列化后输出顺序即为A → B → C,符合预期。
方法二:切换为DataContractSerializer
如果可以更换序列化工具,DataContractSerializer支持跨继承层级的Order排序,只需给所有属性添加[DataMember(Order = n)]特性即可,无需重新声明属性:
using System.Runtime.Serialization; [DataContract] public class BaseClass { [DataMember(Order = 2)] public string? B { get; init; } [DataMember(Order = 3)] public string? C { get; init; } } [DataContract] public class ExtClass : BaseClass { [DataMember(Order = 1)] public string? A { get; init; } }
该序列化器会严格按照Order值从小到大排列所有属性,包括继承自基类的属性。
内容的提问来源于stack exchange,提问作者Proliges
相关产品推荐
相关产品推荐

