C# XmlSerializer如何忽略某些属性 [XmlIgnore]

11次阅读

最直接标准的方式是在属性上添加[xmlIgnore]特性;它仅对public成员生效,可彻底跳过序列化与反序列化,但无法运行时动态控制。

C# XmlSerializer如何忽略某些属性 [XmlIgnore]

在 C# 中,使用 XmlSerializer 序列化对象为 XML 时,若想跳过某个属性不参与序列化,最直接、标准的方式就是在该属性上添加 [XmlIgnore] 特性。

给属性加上 [XmlIgnore] 即可忽略

只需在不想序列化的属性前标注 [XmlIgnore]XmlSerializer 在序列化和反序列化过程中都会自动跳过它:

public class Person {     public String Name { get; set; } 
[XmlIgnore] public int Age { get; set; } // 不会出现在 XML 中  public string Email { get; set; }

}

序列化后生成的 XML 将只包含 NameEmailAge 完全被忽略。

注意:[XmlIgnore] 只对 public 属性/字段生效

XmlSerializer 默认只处理 public 的字段或属性。它不会序列化 privateprotectedinternal 成员,即使没加 [XmlIgnore]。所以:

  • 私有字段(如 private string _id;)无需加 [XmlIgnore],本来就不会被序列化
  • [XmlIgnore] 加在 private 成员上没有实际效果(编译通过但无意义)
  • 如果用 [XmlElement] 显式标记了某个 public 属性,再加 [XmlIgnore] 会覆盖前者,仍被忽略

运行时动态忽略?不行,但可换方案

[XmlIgnore] 是编译期静态特性,不能在运行时开关。如果需要根据条件决定是否忽略某属性,有几种替代思路:

  • 改用 DataContractSerializer + [DataMember(EmitDefaultValue = false)] 配合逻辑控制值
  • 实现 IXmlSerializable,完全自定义序列化逻辑
  • 准备两个 DTO 类型:一个含全部字段,一个精简版(更清晰、推荐)

常见误区提醒

别混淆这些特性:

  • [XmlIgnore]:彻底跳过该成员(序列化 & 反序列化都不处理)
  • [XmlElement(IsNULLable = true)]:仍参与序列化,只是允许值为 null
  • [DefaultValue(...)] + [XmlAttribute]:仅影响默认值省略行为,不等同于忽略
  • [NonSerialized]:仅对 BinaryFormatter 有效,对 XmlSerializer 无效

text=ZqhQzanResources