使用 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);

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

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

它可以像这样在 KryoNamespace 中注册:

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

从那时起,它就像一个魅力。

最新更新