【问题标题】:Deserializing LongMap in Kryo在 Kryo 中反序列化 LongMap
【发布时间】:2017-01-18 23:01:10
【问题描述】:

我有一个字段为scala.collection.mutable.LongMap 类型的类。

在使用Kryo 对其进行序列化后,我尝试反序列化该对象并得到以下异常:

com.esotericsoftware.kryo.KryoException: java.lang.IllegalArgumentException: Can not set final scala.collection.mutable.LongMap field com.name.of.field to scala.collection.mutable.HashMap
Serialization trace:
field (com.name.of)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:626) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na]
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na]
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na]
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na]
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na]
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:729) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na]

IIUC LongMap 被序列化为HashMap,然后由于无法将HashMap 写入LongMap 字段,反序列化失败。

我手动运行https://github.com/romix/akka-kryo-serialization/blob/master/src/test/scala/com/romix/scala/serialization/kryo/MapSerializerTest.scala#L78 之类的东西,并确认序列化的LongMap 被反序列化为HashMap

知道如何正确读取/写入此对象,以便将LongMap 读取为LongMap 而不是HashMap

我需要使用代理类吗?编写自定义序列化器/反序列化器? 或者,是否有一个像样的序列化库可以正确处理LongMaps?

附:我会用LongMap 标记问​​题,但我没有足够的声誉来创建新标签。

【问题讨论】:

  • 显示你的类定义...

标签: scala serialization kryo


【解决方案1】:

是的,您需要添加自定义序列化程序。 https://github.com/twitter/chill#serializers-for-scala-classes 包含 Scala 标准库中某些类型的序列化程序,但显然不是 LongMap(您可能已经在使用这个库,也许是间接使用)。看看他们是怎么做的,然后自己写。

但是,默认情况下不应发生此错误。在您的代码(或您调用的代码)中查找Kryo#registerKryo#setDefaultSerializer 调用:您是在告诉Kryo 将所有scala.collection.mutable.Maps 序列化/反序列化为HashMaps?

【讨论】:

  • 谢谢,为 LongMap 编写自定义序列化程序解决了这个问题。我没有明确调用Kryo#registerKryo#setDefaultSerializer,也没有指示Kryo 将Maps 序列化/反序列化为HashMaps。我认为这是它的默认行为。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2012-08-06
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多