使用DataContractSerializer序列化时,如何忽略嵌套实例的指定属性?
解决DataContractSerializer忽略嵌套类属性的问题
我明白你现在遇到的困扰——用DataContractSerializer序列化时,想忽略Sample3里的property3,但试了[IgnoreDataMember]和[XmlIgnore]都没效果。这其实是没摸透DataContractSerializer的工作规则,我来给你理清楚:
问题根源
DataContractSerializer的序列化逻辑有明确规则:
- 如果类没有标记
[DataContract]特性,它会默认序列化所有公共属性/字段,这时候[IgnoreDataMember]完全不起作用——这个特性只在标记了[DataContract]的类中生效。 [XmlIgnore]是给XmlSerializer用的专属特性,和DataContractSerializer完全不兼容,自然也不会生效。
解决方案
你只需要给Sample3类加上[DataContract]特性,然后给需要序列化的属性标记[DataMember],不需要序列化的property3要么不加[DataMember],要么给它加上[IgnoreDataMember]就行,两种方式效果一致。
修改后的完整代码如下:
[DataContract(Name ="Sample")] public class Sample1 { [DataMember] public Sample2 s2 { get; set; } } [KnownType(typeof(Sample3))] // 这里建议直接用typeof,比字符串方法名更安全不易出错 public class Sample2 { [DataMember] public Sample3 s3 { get; set; } } [DataContract] // 关键:给Sample3加上DataContract特性 public class Sample3 { [DataMember] // 需要序列化的属性标记DataMember public string property1 { get; set; } [DataMember] public string property2 { get; set; } // 方式1:不加DataMember,自动被序列化忽略 public string property3 { get; set; } // 方式2:或者加IgnoreDataMember,效果完全相同 // [IgnoreDataMember] // public string property3 { get; set; } }
额外小提示
你的Sample2类里的[KnownType("KnownTypes")]写法可以优化——如果用字符串方法名,你还得额外写一个返回已知类型列表的静态方法;直接用[KnownType(typeof(Sample3))]会更直观,也能避免拼写错误之类的问题。
内容的提问来源于stack exchange,提问作者MOHANRAJ G
相关产品推荐
相关产品推荐

