我正在尝试确定此类型不可序列化的原因(由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 :(得分:3)
它可能与Function
中的lambda表达式(GetById
)有关
尝试将其转换为AddressOf
调用,以查看VB.NET为您创建的后台闭包是否妨碍了序列化。
(推荐评论回答)
在完整的代码中,要测试是 LINQ还是闭包,只需将原始代码更改为Return Me.FirstOrDefault(False)
即可。
我相信这会使它再次成为可序列化的。如果是这样,您可以使用AddressOf id.Equals
代替具有相同语义的Function(Item)...
,除非您想要满足null(Nothing
)id
。
答案 1 :(得分:2)
可序列化类型需要具有默认构造函数