【问题标题】:Prevent Property from being serialized防止属性被序列化
【发布时间】:2011-12-06 09:16:00
【问题描述】:

我尝试过这样的事情:

    [NonSerialized]
    private string _DecodeText;
    public string DecodeText { get { return _DecodeText; } set { _DecodeText = value; } }

但它不起作用。 “DecodeText”仍在序列化文件中。如何防止属性序列化?

【问题讨论】:

  • 您使用的是什么序列化程序? NonSerialized 属性仅适用于 BinaryFormatter 或 SoapFormatter
  • 我正在使用 XmlSerializer 和 BinaryFormatter。我尝试添加 [XmlIgnore]。同样的问题。然后我尝试将 [XmlIgnore] 添加到属性中。作品。奇异的世界……
  • 是的,XmlSerialiser 适用于公共属性和公共字段(如果我没记错的话)。而二进制序列化器适用于私有和公共字段,因此它不允许您在属性上使用该属性,而 XmlSerialiser 不允许您在私有字段上使用 XmlIgnore 属性。
  • 你解决了 XmlSerialization 的问题,但是 BinaryFormatter 呢?我有同样的问题,我使用 BinaryFormatter 但 NonSerialized 不起作用。

标签: c# wpf


【解决方案1】:

我怀疑您使用的是XmlSerializer?如果是这样,请改用[XmlIgnore] 属性。

这应该应用于属性而不是支持字段,因为 XmlSerializer 序列化公共字段和属性(而 BinaryFormatter 使用 refelction 来获取私有字段 - 因此在使用时使用 NonSerialized 标记私有字段二进制格式化程序)。

【讨论】:

    【解决方案2】:

    我能够使用以下内容并且没有序列化属性(.NET 4.0):

    private string _DecodeText;
    [System.Xml.Serialization.XmlIgnore]
    public string DecodeText { get { return _DecodeText; } set { _DecodeText = value; } }
    

    【讨论】:

    • 有点晚了,因为 Russell Troywest 的帖子有相同的答案...... 1 年前! ;)
    【解决方案3】:

    更新答案

    [NonSerialized] 属性在变量而不是属性上,但不能在属性上。所以它不会有帮助。

    防止属性被序列化的一种方法是添加一个方法

    public bool ShouldSerializeDecodeText() {
       return false;
    }
    

    这(至少对于 XmlSerializer 而言)将阻止属性被序列化。

    如果您不想为类添加大量方法只是为了进行序列化,您可以尝试从它继承并将方法添加到派生类。

    hth, 艾伦。

    【讨论】:

    • 我可能错了,但我认为 BinaryFormatter 不会对属性进行序列化。只有字段。如果他们使用不同的序列化程序,该属性可能不起作用。
    • 事实上,NonSerialized 属性有一个属性 [AttributeUsageAttribute(AttributeTargets.Field, Inherited = false)] 所以我认为将它添加到属性中可能会给你一个编译错误。
    • 我的错,刚刚看到该字段上的属性并进入“Gotcha”。该属性不能继续属性,并且由于某种原因,当我测试它时,XmlSerializer 也没有在该字段上兑现它。
    • 好的,更好的尝试。来自stackoverflow.com/questions/1296468/…如果添加一个返回false的方法bool ShouldSerializeDecodeText(),它不会序列化属性。
    【解决方案4】:

    我建立在@John 的答案之上并修改了 ef.tt 模板 包括 [System.Xml.Serialization.XmlIgnore]

    这里是代码

            foreach (var navigationProperty in navigationProperties)
            {
                if (navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many)
                {
    #>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        [System.Xml.Serialization.XmlIgnore]
    <#
                }
    #>
        <#=codeStringGenerator.NavigationProperty(navigationProperty)#>
    <#
            }
    

    【讨论】:

      【解决方案5】:

      我认为这段代码会对大家有所帮助。使用您声明的属性并且您希望它只被序列化。然后你应该添加一个方法返回类型为布尔值,名称方法是 ShouldSerialize 作为前缀与 [NameProperty]。如下代码和link Newtonsoft 为您提供参考:

      public class DisplayFieldSetting
      {
              public bool ShouldSerializeHidden()
              {
                  return false;
              }
      
              public bool ShouldSerializeKeepOriginialColumnName()
              {
                  return false;
              }
      
      
              public string Hidden { get; set; }
              public string KeepOriginialColumnName{ get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-04
        • 2010-12-16
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多