【问题标题】:Ignore binary serialization on a property忽略属性的二进制序列化
【发布时间】:2010-02-25 15:22:21
【问题描述】:

我有一个普通的 C# POCO。在班级级别,我正在用[Serializable()] 装饰对象。

也就是说,我在其中一个属性上使用 Linq Sum(),并且在序列化时收到错误消息。如果可能的话,我只想简单地忽略这个属性。但是,[XmlIgnore()] 仅用于 Xml 序列化,而不是二进制。有什么想法或想法吗?

代码是这样的,我想忽略ValueTotal

[Serializable()]
public class Foo
{
  public IList<Number> Nums { get; set; }

  public long ValueTotal
  {
    get { return Nums.Sum(x => x.value); }
  }
}

【问题讨论】:

  • 注意回复中的重复点; BinaryFormatter 首先不关心属性...

标签: c# serialization


【解决方案1】:

ValueTotal 已被忽略。只有数据被序列化,而不是方法。属性实际上是方法。

如果您希望忽略字段而不对其进行序列化,请将它们标记为 [NonSerialized]

'或'

你可以实现ISerializable而不是序列化那些字段。

这里是一些关于如何实现ISerializable 和序列化数据的示例代码:http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

【讨论】:

  • 如果是PropertyChangedEventHandler这样的事件,应该用[field: NonSerialized]标记。我认为这对于查看您的答案以搜索我正在搜索的内容的人很有用。
  • 你在搜索什么?`
  • 我想在二进制序列化过程中跳过事件的序列化,我打开的第一个帖子就是这个。我实际上需要 [field: NonSerialized] 标记,所以我认为评论会很有用。
【解决方案2】:

    [NonSerialized]
    private IList<Number> nums;
    public IList<Number> Nums { get {return nums;} set { nums = value; }  } 

【讨论】:

  • 再读一遍。他喜欢忽略 ValueTotal-Property,而不是列表
  • 无需忽略 ValueTotal 属性。二进制序列化序列化字段,而不是属性
【解决方案3】:

这里没有列出另一种有一些好处的方法(下面的代码是为了支持二进制序列化和 xml)(对于你的例子,你需要一个自定义类来序列化你的接口):

    [OnSerializing]
    private void OnSerializing(StreamingContext context)
    {
        xmlShape4Port = new xmlStreamShape(shape4Port);
        shape4Port = null;
    }
    [OnDeserialized]
    private void OnDeserialized(StreamingContext context)
    {
        if (xmlShape4Port != null)
        {
            shape4Port = xmlShape4Port.getShapeFromSaved();
            xmlShape4Port = null;
        }
    }

    [XmlIgnore()]
    public virtual StreamShape shape4Port {get;set;}

    [XmlElement("shape4Port")]
    public xmlStreamShape xmlShape4Port
    {
        get
        {
            if (shape4Port == null)
                return null;
            else
            {
                return new xmlStreamShape(shape4Port);
            }
        }
        set
        {
            shape4Port = value.getShapeFromSaved();
        }
    }

【讨论】:

    【解决方案4】:

    实现ISerializable 接口,然后在GetObjectData() 方法中使用[XmlIgnore] 进行XML 序列化,然后输出为二进制。它实际上比我刚才描述的要简单。

    有关想法,请参阅http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

    【讨论】:

      【解决方案5】:

      欺骗和使用方法

      [Serializable()]
      public class Foo
      {
        public IList<Number> Nums { get; set; }
      
        public long GetValueTotal()
        {
          return Nums.Sum(x => x.value);
        }
      }
      

      【讨论】:

      • +1 虽然我有时会遇到属性等于状态的问题,并且有时会计算状态,但我开始更加同意,如果您正在进行计算,那么您应该使用它显示的方法该值是计算结果的意图。事实是,你为什么要序列化一个计算出来的值,难道不应该序列化你想要的数据,然后在另一边重做计算?
      • 我同意 NerdFury,这确实更好地传达了我的意图。谢谢你。 -杰西·豪尔
      • 如何解决“序列化时收到错误”的问题?我假设 Number 是不可序列化的,因此序列化 Nums 属性的支持字段会失败。
      • IMO 这完全是错误的。 BinaryFormatter 不查看方法或属性 - 它只查看字段。将属性更改为字段不应以任何方式影响BinaryFormatter 在此处的工作方式。
      • @NerdFury 有时您希望某种计算数据可用于在数据绑定中显示。在这种情况下,一个方法是不行的。
      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 2013-04-07
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 2016-02-03
      • 2017-01-08
      • 2016-05-17
      相关资源
      最近更新 更多