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

hop*_*pla 36 c# serialization automatic-properties

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

Jeh*_*hof 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; }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以直接在属性上使用 [field: NonSerialized]。 (2认同)

xyz*_*xyz 8

// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;
Run Code Online (Sandbox Code Playgroud)

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


Ber*_*ern 7

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

您不需要创建字段.

所以你的代码是:

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

     public object DoNotIgnoreMe { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*nil 5

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


Nei*_*ell 5

我不确定你能不能。这篇MSDN 文章SerializableAttribute建议您实现 ISerializable 并自己控制序列化:

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

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


Ser*_*kov 5

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

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

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