非财产化的财产

IAd*_*ter 56 .net c# serialization properties

当我写这样的代码

[XmlIgnore]
[NonSerialized]
public List<string> paramFiles { get; set; }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Attribute 'NonSerialized' is not valid on this declaration type.
It is only valid on 'field' declarations.
Run Code Online (Sandbox Code Playgroud)


如果我写

[field: NonSerialized]
Run Code Online (Sandbox Code Playgroud)

我收到以下警告

'field' is not a valid attribute location for this declaration.
Valid attribute locations for this declaration are 'property'.
All attributes in this block will be ignored.
Run Code Online (Sandbox Code Playgroud)


如果我写

[property: NonSerialized]
Run Code Online (Sandbox Code Playgroud)

我再次收到以下错误:

Attribute 'NonSerialized' is not valid on this declaration type.
It is only valid on 'field' declarations.
Run Code Online (Sandbox Code Playgroud)


我怎样才能[NonSerialized]在物业上使用?

Ant*_*rko 69

使用简单:

[XmlIgnore]
[ScriptIgnore]
public List<string> paramFiles { get; set; }
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助.

  • 事实上,这甚至适用于经典的ASP.NET Web服务场景,它完全隐藏了消费者的属性名称(对于那些陷入WCF前项目的人而言,这是一个很好的技巧) (2认同)
  • 我不需要使用[ScriptIgnore]来完成这项工作 (2认同)

wie*_*ero 49

嗯......第一个错误说你不能这样做......来自http://msdn.microsoft.com/en-us/library/system.nonserializedattribute.aspx

 [AttributeUsageAttribute(AttributeTargets.Field, Inherited = false)]
 [ComVisibleAttribute(true)]
 public sealed class NonSerializedAttribute : Attribute
Run Code Online (Sandbox Code Playgroud)

我建议使用支持领域

 public List<string> paramFiles { get { return list;}  set { list = value; } }
 [NonSerialized]
 private List<string> list;
Run Code Online (Sandbox Code Playgroud)

  • 使用建议的支持字段似乎不起作用.该物业仍在序列化. (13认同)
  • 正确的属性是[NonSerialized],而不是[NonSerializable] (3认同)
  • NonSerialized将用于BinaryFormatter(至少)序列化字段,并且可能不适用于序列化属性的Json或XML序列化程序. (2认同)

小智 31

从 C# 7.3 开始,您可以将属性附加到自动实现的属性的支持字段。

因此,如果您将项目的语言更新为 C# 7.3,以下内容应该有效:

[field: NonSerialized]
public List<string> paramFiles { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 这应该被重新标记为最佳答案,因为它非常棒。 (6认同)

Zia*_*iki 9

对于使用 JSON 而不是 XML 的用户,您可以在[JsonIgnore]属性上使用该属性:

[JsonIgnore]
public List<string> paramFiles { get; set; }
Run Code Online (Sandbox Code Playgroud)

Newtonsoft.JsonSystem.Text.Json (.NET Core 3.0) 中可用。


Tez*_*zra 6

从 .NET 3.0 开始,您可以使用DataContract而不是 Serialized。不过,对于 DataContract,您需要通过使用DataMember属性标记可序列化字段来“选择加入”;或者通过使用 DataMember 属性来“选择加入”。或使用IgnoreDataMember “选择退出” 。

选择加入与选择退出之间的主要区别在于,选择退出默认情况下只会序列化公共成员,而选择加入只会序列化标记的成员(无论保护级别如何)。