如何避免序列化默认值?

时间:2012-02-24 11:01:44

标签: c#

我应该如何标记属性,如果它们具有默认值,则不应序列化?例如,如果我有布尔值,那么如果只设置为true,那么shoudl将被序列化,与可空值相同,如果它们为null,我不想将它们包含在我的序列化文件中。

3 个答案:

答案 0 :(得分:22)

好的,我自己找到了。它是[DefaultValue(false)]。如果我用这个attr标记一些属性,那么只有当它与()中的值不同时才会被序列化。

System.ComponentModel.DefaultValueAttribute

答案 1 :(得分:4)

有指定属性这样的东西。我找不到msdn文档,但this article应该有帮助。 基本上你必须写这样的东西:

//this property would not be serialized if it contains String.Empty value
public string PropertyName   {   get; set;  }


[XmlIgnore]
public bool PropertyNameSpecified
{
    get  { return PropertyName != String.Empty; }
}

答案 2 :(得分:0)

@kosnkov的回答使我处在正确的轨道上。就我而言,无论是否进行反序列化,我都希望默认使布尔值为true。我最终得到了这样的东西:

public class Person {
   public string Name {get;set;}

   [DefaultValue(true)]
   public bool IsAdult {get;set;} = true
}

所以这个杰森

{"Name" :"SomePerson"}

结果进入该对象

{ Name : "SomePerson", IsAdult : true}

说明:

  • 默认值属性告诉串行器默认值是什么。因此,它只会影响序列化程序是否覆盖当前值的决定,因为它与提供的值或默认值都不匹配。
  • = true设置初始值
  • 您仍然必须提供初始值,因为序列化程序不会触摸IsAdult属性,但是根据systemDefault,布尔值是false。