在 Kryo 中反序列化 LongMap
Deserializing LongMap in Kryo
我有一个 class,字段类型为 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
.
知道如何正确 read/write 这个对象,这样 LongMap
将被读作 LongMap
而不是 HashMap
吗?
我需要使用代理吗class?写一个自定义serializer/deserializer?
或者,是否有一个像样的序列化库可以正确处理 LongMap
s?
P.S。我会用 LongMap
标记问题,但我没有足够的声誉来创建新标签。
是的,您需要添加自定义序列化程序。 https://github.com/twitter/chill#serializers-for-scala-classes 包含 Scala 标准库中某些类型的序列化程序,但显然不包含 LongMap
(您可能已经在间接使用该库)。看看他们是怎么做的,然后自己写。
但是,默认情况下不应发生此错误。在您的代码(或您调用的代码)中查找 Kryo#register
和 Kryo#setDefaultSerializer
调用:您是否告诉 Kryo serialize/deserialize 所有 scala.collection.mutable.Map
为 HashMap
?
我有一个 class,字段类型为 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
.
知道如何正确 read/write 这个对象,这样 LongMap
将被读作 LongMap
而不是 HashMap
吗?
我需要使用代理吗class?写一个自定义serializer/deserializer?
或者,是否有一个像样的序列化库可以正确处理 LongMap
s?
P.S。我会用 LongMap
标记问题,但我没有足够的声誉来创建新标签。
是的,您需要添加自定义序列化程序。 https://github.com/twitter/chill#serializers-for-scala-classes 包含 Scala 标准库中某些类型的序列化程序,但显然不包含 LongMap
(您可能已经在间接使用该库)。看看他们是怎么做的,然后自己写。
但是,默认情况下不应发生此错误。在您的代码(或您调用的代码)中查找 Kryo#register
和 Kryo#setDefaultSerializer
调用:您是否告诉 Kryo serialize/deserialize 所有 scala.collection.mutable.Map
为 HashMap
?