Scala 在Kryo中反序列化LongMap

Scala 在Kryo中反序列化LongMap,scala,serialization,kryo,Scala,Serialization,Kryo,我有一个类,其字段为scala.collection.mutable.LongMaptype 使用Kryo序列化对象后,我尝试反序列化该对象并获得以下异常: com.esotericsoftware.kryo.KryoException: java.lang.IllegalArgumentException: Can not set final scala.collection.mutable.LongMap field com.name.of.field to scala.collection

我有一个类,其字段为
scala.collection.mutable.LongMap
type

使用
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
字段

我手动运行了类似的程序,并确认序列化的
LongMap
被反序列化为
HashMap

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

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


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

是的,您需要添加自定义序列化程序。Scala标准库中的某些类型包含序列化程序,但显然不包括
LongMap
(您可能已经在间接使用此库)。看看他们是怎么做的,然后自己写


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

显示您的类定义…谢谢,为LongMap编写自定义序列化程序解决了这个问题。我没有显式调用
Kryo#register
Kryo#setDefaultSerializer
,也没有指示Kryo将
Map
s序列化/反序列化为
HashMap
s。我认为这是它的默认行为。