【问题标题】:Unable to iterate over scala list serialized with kryo无法迭代使用 kryo 序列化的 scala 列表
【发布时间】:2014-10-12 09:10:45
【问题描述】:

我有一个 Scala/Akka 应用程序,它使用 Kryo 存储序列化消息,然后在未来运行时将它们重新引入系统。但是,当我尝试对消息中的列表运行 for comprehension 时,我收到了 Scala 的异常。

java.util.NoSuchElementException: head of empty list
    at scala.collection.immutable.Nil$.head(List.scala:422)
    at scala.collection.immutable.Nil$.head(List.scala:419)
    at scala.collection.immutable.List.map(List.scala:278)
    ...

【问题讨论】:

  • 作为说明,当我确定消息不是来自 kryo 序列化消息时,我遇到了这个问题(因为我认为没有,持久存储在开始时被清除测试)。在我最终发现 Kryo 参与之前,工作起来非常糟糕——希望如果其他人遇到这个问题,他们可能会发现问题并推动 Kryo,因为我花了一段时间才明白。

标签: scala serialization singleton akka null


【解决方案1】:

这可能是由于使用 Kryo 序列化数据而没有使用特定于 scala 的序列化程序。

问题在于 Scala 会在每次 JVM 启动时创建像 Nil 这样的单例对象,然后使用身份与它们进行比较(因为这样做非常快)。不幸的是,Kryo 并不知道该对象本质上是一个单例,因此当您反序列化时,您会返回一个不同的 Nil 实例(当 scala 假设只有一个时)。

解决方案是确保 Kryo 将这些对象反序列化回当前运行的正确表示,这可以使用像 chill 这样的库来实现(特别是 chill-scala 序列化程序)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2015-05-23
    • 1970-01-01
    • 2012-08-06
    • 2017-01-19
    相关资源
    最近更新 更多