2009-10-24 73 views
3

This question可能與我的很相似,但我看不到我需要的答案。我有一個班,名爲CASM,有一個List<Action>。我想序列化這個類(使用BinaryFormatter或類似的東西)。此類和Action中引用的所有類都具有正確的[Serializable][NonSerializable]屬性。序列化匿名代表名單

問題是當序列化嘗試 - 它給出了這樣的錯誤:

Type 'CASM.CASM+<>c__DisplayClass2c' in Assembly 'CASM, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null' is not marked as serializable. 

<>c__DisplayClass2c是保存不同類型的匿名委託的我用我的應用程序自動生成的內部類。然而,正如我們可以從下面的圖片看到,這是不是[Serializable]

alt text http://bayimg.com/image/maebbaacj.jpg

什麼會改變我的應用程序,這樣做的工作的最好方法?讓我自己的<>c__DisplayClass2c類型的類,並使其可串行化?或者,還有更好的方法?


編輯:最後我只是做我自己的類,而不是自動生成一個。我幫助調試,實際上有一個描述性名稱,而不僅僅是b__12()

+0

你說這個班是自動生成的 - 它是如何完成的?控制它嗎?它是由第三方組件生成的嗎? – 2009-10-24 17:24:51

+0

它由編譯器自動生成 - 它具有[CompilerGenerated]屬性。我認爲這只是一個類/地方來存儲一些非常相似的匿名代理(在這種情況下,它們都是無效的並接受一個字符串[]作爲參數)。 – 2009-10-24 17:27:21

+0

然後是的,嘗試創建自己的班級。你也可能有一個匿名方法的問題(我沒有嘗試過,所以我不知道),在這種情況下,嘗試非匿名版本。如果即使這樣也行不通,你可以嘗試先將這些方法轉換爲表達式(這些_should_可序列化) – 2009-10-24 17:30:25

回答

4

序列化委託通常沒什麼意義。通常,您會選擇將代理字段標記爲[NonSerialized],並在需要時重新創建代理字段。如果你的主要意圖來存儲代表,那麼坦率地說,我會建議你想一個完全不同的方法。

此外,注意BinaryFormatter脆,如果你打算保持數據的任何時間(但可以接受的臨時數據)

爲了進一步看,我懷疑我們需要看一些重複性碼。


更新:其實,我懷疑你可以通過編寫自己的明確捕獲類(而不是編譯器生成的)序列化。但我仍然認爲這個概念有根本的缺陷。手寫捕捉類並不好玩。


爲了解決評論中的要點;再長期存儲 - 因爲它是so darned brittle - 這是從改變簡單:

public int Value {get;set;} 

private int value; 
public int Value { 
    get {return value;} 
    set { 
     if(value < 0) throw new ArgumentOutOfRangeException(); 
     this.value = value; 
    } 
} 

會破壞系列化;同樣會改變程序集,輸入名稱,「看它有趣」等。

重回代表;舉一個手動捕捉的例子;而不是:

int i = ... 
Predicate<Foo> test = delegate (Foo x) { return x.Bar == i;} 

你可以這樣做:

int i = ... 
MyCapture cpt = new MyCapture(i); 
Predicate<Foo> test = cpt.MyMethod; 

[Serializable] 
class MyCapture { 
    private int i; 
    public MyCapture(int i) {this.i = i;} 
    public bool MyMethod(Foo x) {return x.Bar == i;} 
} 

正如你可以看到 - 並不總是微不足道的(這是最簡單的例子)。

+0

我知道像這樣的評論即將到來 - 這似乎是一件很奇怪的事情。然而,代表似乎是我嘗試做的最好的(或至少是最快的)方法。創建委託需要花費相當長的時間,所以如果我能存儲它們,這將是一件好事。我現在已經從Nader Shirazie的評論中看到表達式樹後意識到我基本上試圖重新創建有限的表達式樹系統/語法(即從代表構建代碼)。爲什麼BinaryFormatter不適合長期存儲數據? – 2009-10-24 18:40:51

+0

啊,謝謝。所以像protobuf-net或XML這樣的另一個系統不會有這個「脆弱」的問題,因爲它們不存儲類型/版本/程序集等? – 2009-10-24 21:38:13

+0

確切地說;大多數串行器僅存儲* data *;這使得它實現獨立,並且通常更短。 'BinaryFormatter'存儲類型/字段信息,這是非常**實現特定的。 – 2009-10-25 07:26:55