非财产化的财产

时间:2011-10-07 22:18:36

标签: c# .net serialization properties

当我写这样的代码时

[XmlIgnore]
[NonSerialized]
public List<string> paramFiles { get; set; }

我收到以下错误:

Attribute 'NonSerialized' is not valid on this declaration type.
It is only valid on 'field' declarations.


如果我写

[field: NonSerialized]

我收到以下警告

'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.


如果我写

[property: NonSerialized]

我再次收到以下错误:

Attribute 'NonSerialized' is not valid on this declaration type.
It is only valid on 'field' declarations.


如何在属性上使用[NonSerialized]

5 个答案:

答案 0 :(得分:67)

简单使用:

[XmlIgnore]
[ScriptIgnore]
public List<string> paramFiles { get; set; }

希望它有所帮助。

答案 1 :(得分:45)

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

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

我建议使用支持字段

 public List<string> paramFiles { get { return list;}  set { list = value; } }
 [NonSerialized]
 private List<string> list;

答案 2 :(得分:4)

在C#7.3中,您可以将属性附加到自动实现属性的后备字段。

因此,如果您将项目的语言更新为C#7.3,则以下方法应该起作用:

[field: NonSerialized]
public List<string> paramFiles { get; set; }

答案 3 :(得分:2)

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

[JsonIgnore]
public List<string> paramFiles { get; set; }

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

答案 4 :(得分:1)

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

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