NonSerialized 属性

Posted

技术标签:

【中文标题】NonSerialized 属性【英文标题】:NonSerialized on property 【发布时间】:2011-12-03 08:25:02 【问题描述】:

当我写这样的代码时

[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]

【问题讨论】:

How to mark a property as non serializable for json?的可能重复 【参考方案1】:

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

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

在Newtonsoft.Json 和System.Text.Json (.NET Core 3.0) 中均可用。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

这应该被重新标记为最佳答案,因为它非常棒。【参考方案3】:

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

opt-in 与 opt-out 的主要区别在于,opt-out 默认只会序列化公共成员,而 opt-in 只会序列化标记的成员(无论保护级别如何)。

【讨论】:

【参考方案4】:

嗯...第一个错误说您不能这样做... 来自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;

【讨论】:

使用建议的支持字段似乎不起作用。该属性仍在序列化中。 是的,它可以工作,但不是在每个名为 AaaSerializer 的类中。您使用的是哪个序列化程序? 正确的属性是[NonSerialized],而不是[NonSerializable] oy...如果您的“支持字段”是一种方法怎么办? NonSerialized 将适用于(至少)序列化字段的 BinaryFormatter,并且可能不适用于序列化属性的 Json 或 XML 序列化器。【参考方案5】:

简单使用:

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

希望对您有所帮助。

【讨论】:

事实上,这甚至可以在经典的 ASP.NET Web 服务场景中通过完全隐藏消费者的属性名称(对于那些卡在 WCF 之前的项目中的人来说是一个很棒的技巧) 我不需要使用 [ScriptIgnore] 来完成这项工作 @AntonioNicolaasTeyken 这取决于您使用什么来序列化数据。就我而言,[ScriptIgnore] 阻止了 Json 序列化。 还有一点需要注意:ScriptIgnoreAttributeSystem.Web.Script.Serialization 命名空间 (MSDN) 中可用。 明确一点,这适用于二进制序列化程序吗?因为示例中的问题已经包含 XmlIgnore,所以不确定这有什么帮助。

以上是关于NonSerialized 属性的主要内容,如果未能解决你的问题,请参考以下文章

Xml 序列化

非财产化的财产

SerializeField等Unity内的小用法

C# System.Serializable() 问题

.Net Attribute详解(上)-Attribute本质以及一个简单示例

2019.10.26 SerializeField等Unity内的小用法