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

XML序列化新增同类型对象属性后标签消失的问题排查与解决

问题解答

现象是否正常?

这个现象完全不正常,属于XML序列化特性配置冲突引发的异常行为。

问题根源

当你给两个同类型的属性分别标记[XmlElement("FI")]和[XmlElement("DI")]时,.NET的XML序列化器会默认将它们视为同一元素的重复实例(即数组形式),但你的代码里是两个独立的单值属性,这种配置不匹配会导致序列化逻辑混乱,最终两个标签都被忽略。

解决办法(无需创建单独类)

场景1:二选一显示(同一时间只输出FI或DI)

如果你的需求是仅在对应对象存在时显示其中一个标签,推荐用[XmlChoiceIdentifier]特性明确指定序列化目标,步骤如下:

  1. 定义枚举标识元素类型:
public enum InfoType
{
    FI,
    DI
}
  1. 修改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; }
}
  1. 序列化前根据赋值情况设置标识:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:40:20