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 序列化。 还有一点需要注意:ScriptIgnoreAttribute
在 System.Web.Script.Serialization
命名空间 (MSDN) 中可用。
明确一点,这适用于二进制序列化程序吗?因为示例中的问题已经包含 XmlIgnore,所以不确定这有什么帮助。以上是关于NonSerialized 属性的主要内容,如果未能解决你的问题,请参考以下文章