37

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

4

7 回答 7

60

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

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

于 2009-11-13T10:41:20.917 回答
6

如果您要序列化到 Json 并使用Json.NET 序列化程序(我强烈推荐它,因为它比市场上的许多其他序列化程序提供更多的功能),那么您可以使用[JsonIgnore].

您无需创建字段。

所以你的代码是:

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

     public object DoNotIgnoreMe { get; set; } 
}
于 2013-07-19T10:08:40.623 回答
5

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

于 2009-11-13T10:26:49.247 回答
5

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

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

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

于 2009-11-13T10:28:40.507 回答
5

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

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

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

于 2010-01-14T16:01:29.270 回答
2

使用非序列化支持字段的建议解决方案似乎不适用于 .NET 4.0(至少在 Xml 序列化的情况下)。该字段确实没有被序列化,但使用它的公共财产确实会序列化,从而违背了目的。在 Xml 序列化的情况下,使用 XmlIgnore 解决方法会有所帮助。免责声明 - 我没有验证二进制序列化行为。

于 2011-12-12T23:41:51.113 回答