Почему этот тип не сериализуем? - PullRequest
1 голос
/ 18 июля 2010

Я пытаюсь определить, почему этот тип не сериализуем (как проверено 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 ]

3 голосов
/ 18 июля 2010

Это может быть связано с лямбда-выражением (Function) в GetById.
Попробуйте преобразовать его в вызов AddressOf, чтобы увидеть, попадает ли замыкание фона, созданное для вас VB.NET,способ сериализации.

(Продвижение комментария к ответу)
В вашем полном коде, чтобы проверить, является ли значение LINQ илизакрытие, просто измените свой исходный код на Return Me.FirstOrDefault(False).

Я верю, что это снова сделает сериализуемым.Если это так, вы можете использовать AddressOf id.Equals вместо Function(Item)..., который имеет ту же семантику, если только вы не хотите обслуживать ноль (Nothing) id.

2 голосов
/ 18 июля 2010

Сериализуемые типы должны иметь конструктор по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...