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

我怎样才能防止二进制格式化程序自动实现的属性被序列化? [NonSerialized]属性只能与字段一起使用。 当使用自动实现的属性时,该字段被隐藏。

它不支持自动实现的属性。 您必须使用支持字段并在其上设置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; } } } 
 // This works for the underlying delegate of the `event` add/remove mechanism. [field:NonSerialized] public event EventHandler SomethingHappened; 

但它似乎并没有自动实现的属性。 我认为这是值得一提的,因为知道序列化附加了事件订阅者的对象是非常有用的。

如果你序列化为Json并使用Json.NET序列化器 (我强烈推荐这个序列化器 ,因为它比市场上的许多其他序列化器提供了更多的东西),那么你可以使用[JsonIgnore]

你不需要创build一个字段。

所以你的代码是:

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

如果你是序列化到Xml那么你可以使用XmlIgnore属性。

我不确定你可以。 这个关于SerializableAttribute MSDN文章build议你实现ISerializable并自己控制序列化:

除非types实现ISerializable接口来覆盖序列化过程,否则所有由SerializableAttribute标记的types中的公有和私有字段都将被默认序列化。

或者切换到该特定字段的自动属性。

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

此行为是devise使然”。 在实现自动属性时的决定是在“常见”情况下工作,除此之外,这意味着在生成的字段上没有任何属性。 这背后的想法是保持简单,不要慢慢地将它们变成完整的属性。 所以,如果你需要使用NonSerialized属性,完整的属性就是这个样子。

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

使用非序列化后台字段的build议解决scheme似乎不能与.NET 4.0一起正常工作(至less在Xml序列化的情况下)。 该字段确实不会被序列化,但使用它的公共属性会序列化,从而失败目的。 使用XmlIgnore解决方法有助于在Xml序列化的情况下。 免责声明 – 我没有validation二进制序列化行为。