在Kryo中反序列化LongMap

时间:2016-09-11 09:08:01

标签: scala serialization kryo

我的课程的字段为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

我需要使用代理类吗?编写自定义序列化器/解串器? 或者,是否有适当的序列化库来正确处理LongMap

P.S。我会用LongMap标记问题,但我没有足够的声誉来创建新标记。

1 个答案:

答案 0 :(得分:0)

是的,您需要添加自定义序列化程序。 https://github.com/twitter/chill#serializers-for-scala-classes包含Scala标准库中某些类型的序列化程序,但显然不适用于LongMap(您可能已经在使用此库,可能是间接的)。看看他们是如何做到并写下你自己的。

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