为什么这种类型不可序列化?

时间:2010-07-18 14:39:05

标签: .net vb.net serialization

我正在尝试确定此类型不可序列化的原因(由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

2 个答案:

答案 0 :(得分:3)

它可能与Function中的lambda表达式(GetById)有关 尝试将其转换为AddressOf调用,以查看VB.NET为您创建的后台闭包是否妨碍了序列化。

(推荐评论回答)
在完整的代码中,要测试 LINQ还是闭包,只需将原始代码更改为Return Me.FirstOrDefault(False)即可。

我相信这会使它再次成为可序列化的。如果是这样,您可以使用AddressOf id.Equals代替具有相同语义的Function(Item)...,除非您想要满足null(Nothingid

答案 1 :(得分:2)

可序列化类型需要具有默认构造函数