【问题标题】:NonSerialized on propertyNonSerialized 属性
【发布时间】: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]

【问题讨论】:

标签: c# .net serialization properties


【解决方案1】:

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

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

Newtonsoft.JsonSystem.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,所以不确定这有什么帮助。
      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多