XML序列化新增同类型对象属性后标签消失的问题排查与解决
问题解答
现象是否正常?
这个现象完全不正常,属于XML序列化特性配置冲突引发的异常行为。
问题根源
当你给两个同类型的属性分别标记[XmlElement("FI")]和[XmlElement("DI")]时,.NET的XML序列化器会默认将它们视为同一元素的重复实例(即数组形式),但你的代码里是两个独立的单值属性,这种配置不匹配会导致序列化逻辑混乱,最终两个标签都被忽略。
解决办法(无需创建单独类)
场景1:二选一显示(同一时间只输出FI或DI)
如果你的需求是仅在对应对象存在时显示其中一个标签,推荐用[XmlChoiceIdentifier]特性明确指定序列化目标,步骤如下:
- 定义枚举标识元素类型:
public enum InfoType { FI, DI }
- 修改
ChangeRestartProcessing类的属性配置:
public class ChangeRestartProcessing { public string TransportId { get; set; } [XmlIgnore] public InfoType CurrentInfoType { get; set; } [XmlElement("FI")] [XmlChoiceIdentifier("CurrentInfoType")] public YourInfoClass FinalInformation { get; set; } [XmlElement("DI")] [XmlChoiceIdentifier("CurrentInfoType")] public YourInfoClass NormalInformation { get; set; } }
- 序列化前根据赋值情况设置标识:
var data = new ChangeRestartProcessing { TransportId = "TR001", FinalInformation = new YourInfoClass(), // 假设给FI赋值 CurrentInfoType = InfoType.FI }; // 此时序列化结果只会显示<FI>标签
场景2:允许同时显示FI和DI
如果需要两个标签在对应对象存在时都显示,只需给[XmlElement]添加Order参数明确序列化顺序,同时确保属性不为null:
public class ChangeRestartProcessing { public string TransportId { get; set; } [XmlElement("FI", Order = 1)] public YourInfoClass FinalInformation { get; set; } [XmlElement("DI", Order = 2)] public YourInfoClass NormalInformation { get; set; } }
是否需要创建单独类?
完全不需要。通过调整XML序列化特性的配置,就能在现有类结构下解决问题,无需额外创建新类。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

