2010-07-18 84 views
1

我試圖確定爲什麼這種類型不是可序列化(由Type.IsSerializable()測試)爲什麼這種類型不可序列化?

<Serializable()> _ 
Public MustInherit Class WellKnownInstanceCollectionWithTypedId(Of T As WellKnownInstanceWithTypedId(Of IdT), IdT) 
    Inherits ReadOnlyCollection(Of T) 

    Public Sub New(ByVal list As IList(Of T)) 
     MyBase.New(list) 
    End Sub 


    Public Function GetById(ByVal id As IdT) As T 
     Return Me.FirstOrDefault(Function(item) item.Id.Equals(id)) 
    End Function 

End Class 

我知道它是與我的GetById功能,因爲如果我刪除一切都很好。有人能告訴我,我需要改變這種類型的可序列化嗎?

更新:

當我改變我的GetById實現正因爲如此,一切都很好。顯然這與Linq有關(如下所示) - 任何人都可以給我進一步的細節,爲什麼這是這樣嗎?

Public Function GetById(ByVal id As IdT) As T 
     For Each i In Me 
      If i.Id.Equals(i) Then 
       Return i 
      End If 
     Next 
     Return Nothing 
    End Function 
+0

嘗試序列化它,它會拋出異常與更多細節 – Andrey 2010-07-18 18:34:47

+0

我想確認它不是使用LINQ('FirstOrDefault'),而是使用閉包(函數'訪問本地變量,或在此情況下一個參數)。然而,我無法重現你的問題:'GetType(WellKnownInstanceCollectionWithTypedId(Of,))。IsSerializable'在你的原始定義中爲.NET 3.5返回'True'。 – 2010-07-19 00:10:12

回答

3

這可能與在GetById lambda表達式(Function)。
嘗試將其轉換爲AddressOf調用,以查看VB.NET爲您創建的後臺關閉是否正在進行序列化。

(促進評論回答)
在你的完整代碼,測試它是否 LINQ或關閉,只是改變你原來的代碼Return Me.FirstOrDefault(False)

我相信會使它再次成爲可序列化的。如果是這樣,您可以使用AddressOf id.Equals而不是Function(Item)...,它具有相同的語義,除非您想要滿足空值(Nothingid

+0

非常奇怪......當我替換我的GetById impl來使用interation而不是linq時,它變成了可序列化的......我很想知道在這背後的進一步推理。 – DanP 2010-07-18 17:07:06

+0

我實際上已經將我的linq函數作爲規範進行了外化,並且由GetById函數調用了這些函數(我還有其他情況下序列化因此而失敗);非常奇怪,但我現在已經按預期工作 - 感謝提示! – DanP 2010-07-19 10:33:40

2

序列化類型需要有一個默認的構造函數

+0

ReadOnlyCollection確實有一個,所以這不是問題。 – DanP 2010-07-18 17:06:32

+0

@DanP但構造函數沒有被繼承,所以這可能仍然是一個問題。 – 2010-07-19 00:11:50

+0

好吧,在這種情況下,它似乎並不重要。刪除我的GetById方法的inital impl導致類可序列化。 – DanP 2010-07-19 00:54:24

相關問題