2010-02-25 74 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(); 
     } 
    } 
相關問題