使用Kryo序列化synchronizedMap

时间:2018-05-16 09:16:57

标签: java serialization deserialization kryo

对于个人项目,我必须使用Kryo-Framework在Java中序列化Collections.sychronizedMap。我被绑定到该框架,因为还有其他依赖项需要它。我目前的尝试看起来像这样:

Serializer SERIALIZER = Serializer.using(KryoNamespace.builder()
                    .register(KryoNamespaces.BASIC)
                    .register(Collections.EMPTY_MAP.getClass())
                    .register(Class.forName("java.util.Collections$SynchronizedMap"))
                    .build());

Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());

map.put("test", "123");

byte[] encoded = SERIALIZER.encode(map);

Map<String, String> decoded = SERIALIZER.decode(encoded);

这种方法适用于序列化部分,但我正在努力使反序列化工作。每当我运行这段代码时,在反序列化过程中调用synchronizedMap上的NullPointerException方法时会抛出put。其原因似乎是synchronizedMap使用的内部映射,因为在反序列化后它是null。但是我的错误在哪里?我可以以某种方式使这个代码工作吗?

1 个答案:

答案 0 :(得分:0)

我使用https://github.com/magro/kryo-serializers解决了这个问题,这是一个特别针对序列化特殊java类型的kryo库。

它可以在KryoNamespace中注册,如下所示:

.register(new SynchronizedCollectionsSerializer(), Class.forName("java.util.Collections$SynchronizedMap"))

从那以后,它就像一个魅力。