【问题标题】:Why is this type not serializable?为什么这种类型不可序列化?
【发布时间】:2011-03-17 14:20:36
【问题描述】:

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

【问题讨论】:

  • 尝试序列化它,它会抛出更多细节的异常
  • 我想确认它不是使用 LINQ (FirstOrDefault),而是使用闭包(Function 访问局部变量,或者在这种情况下是参数)。但是我无法重现您的问题:GetType(WellKnownInstanceCollectionWithTypedId(Of ,)).IsSerializable 在 .NET 3.5 中使用您的原始定义为我返回 True

标签: .net vb.net serialization


【解决方案1】:

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

(促进评论回答)
在您的完整代码中,要测试它是 LINQ 还是闭包,只需将您的原始代码更改为Return Me.FirstOrDefault(False)

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

【讨论】:

  • 很奇怪...当我将 GetById impl 替换为使用 interation 而不是 linq 时,它变得可序列化...不过,我很想知道这背后的进一步原因。
  • 我实际上最终将我的 linq 函数外部化为规范,并由 GetById 函数调用这些函数(我有其他情况导致序列化失败);很奇怪,但我现在一切正常 - 感谢您的提示!
【解决方案2】:

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

【讨论】:

  • ReadOnlyCollection 确实有一个,所以这不是问题。
  • @DanP 但是构造函数不是继承的,所以这可能仍然是一个问题。
  • 好吧,在这种情况下,这似乎无关紧要。删除我的 GetById 方法的初始 impl 会导致类可序列化。
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2011-10-31
  • 2012-09-21
  • 2012-02-23
  • 2019-12-23
  • 1970-01-01
相关资源
最近更新 更多