如何防止自动实现的属性被序列化?

时间:2009-11-13 10:22:22

标签: c# serialization automatic-properties

如何防止二进制格式化程序对自动实现的属性进行序列化? [NonSerialized]属性只能与字段一起使用。使用自动实现的属性时,该字段将被隐藏。

7 个答案:

答案 0 :(得分:59)

自动实现的属性不支持。您必须使用支持字段并在其上设置NonSerializedAttribute

public class ClassWithNonSerializedProperty {

  [NonSerialized]
  private object _data;  // Backing field of Property Data that is not serialized

  public object Data{
    get { return _data; }
    set { _data = value; }
  }
}

答案 1 :(得分:8)

// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;

但它似乎不适用于自动实现的属性。我认为值得一提,因为知道何时序列化附加了事件订阅者的对象是有用的。

答案 2 :(得分:6)

如果您正在序列化Json并使用Json.NET serializer(我强烈推荐它,因为它提供了比市场上的许多其他序列化器更多的东西),那么您可以实现您期望的结果使用[JsonIgnore]的属性。

您无需创建字段。

所以你的代码是:

public class ClassName
{
     [JsonIgnore]   
     public object IgnoreMe { get; set; } 

     public object DoNotIgnoreMe { get; set; } 
}

答案 3 :(得分:4)

如果要序列化为Xml,则可以使用XmlIgnore属性。

答案 4 :(得分:4)

我不确定你能不能。这个MSDN article on SerializableAttribute建议你实现ISerializable并自己控制序列化:

  

默认情况下,序列化由SerializableAttribute标记的类型中的所有公共和私有字段,除非该类型实现ISerializable接口以覆盖序列化过程。

或切换远离该特定字段的自动属性。

答案 5 :(得分:4)

自动实现的属性不可能。 考虑一下:

此行为是“按设计”。当时实现自动属性的决定是它们将在“常见情况”中工作,其中除了其他因素之外意味着在生成的字段上没有属性。这背后的想法是保持简单,而不是慢慢地将它们变成完整的属性。 因此,如果您需要使用NonSerialized属性,则可以使用完整属性。

http://social.msdn.microsoft.com/Forums/en-US/vcsharp2008prerelease/thread/2b6eb489-122a-4418-8759-10808252b195

答案 6 :(得分:3)

使用非序列化后备字段的建议解决方案似乎无法在.NET 4.0中正常运行(至少在Xml序列化的情况下)。该字段确实没有被序列化,但使用它的公共属性确实序列化,从而违背了目的。使用XmlIgnore解决方法有助于Xml序列化。免责声明 - 我没有验证二进制序列化行为。