2010-02-25 80 views
30

我有一个常规的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); } 
    } 
} 
+11

注意在答复中的重复点; BinaryFormatter并不关心属性... – 2010-02-25 16:32:25

回答

-11

作弊和使用方法

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

    public long GetValueTotal() 
    { 
    return Nums.Sum(x => x.value); 
    } 
} 
+1

+1虽然我有时候与属性等同于状态并且状态有时会被计算出来,但我开始同意更多,如果你正在进行计算,那么你应该使用一个方法,因为它显示了这个值是计算结果的意图。事实是,为什么要序列化一个计算的值,不应该序列化你想要的数据,然后重新计算另一边的数据? – NerdFury 2010-02-25 15:48:52

+0

我同意NerdFury,这更好地传达我的意图。谢谢。 -Jessy Houle – 2010-02-25 16:03:00

+0

这是如何解决“在序列化时接收错误”的问题? 我认为数字是不可序列化的,因此序列化Nums属性的后台字段将失败。 – Henrik 2010-02-25 16:10:15

32

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

再次阅读。他喜欢忽略ValueTotal属性,而不是列表 – Scoregraphic 2010-02-25 15:38:02

+12

不需要忽略ValueTotal属性。二进制序列化序列化字段,而不是属性 – Henrik 2010-02-25 15:40:17

56

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

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

'或'

可以实现ISerializable,而不是那些序列领域。

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

+0

如果它是一个类似于“PropertyChangedEventHandler”的事件,则应该使用_ [field:NonSerialized] _标记。我认为这对于寻找你的答案寻找我正在寻找的东西是有用的。 – Casper 2017-04-07 15:34:00

+0

你在搜索什么?' – ata 2017-04-10 11:17:13

+0

我想在二进制序列化期间跳过一个事件的序列化,并且我打开的第一篇文章就是这个。我实际上需要_ [字段:NonSerialized] _标记,所以我认为这是有用的评论。 – Casper 2017-04-10 11:35:16

2

有是有一些好处,这里没有列出另一种方式(下文作出的代码同时支持二进制序列化和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(); 
     } 
    }