java - 使用 Kryo 序列化同步映射

标签 java serialization deserialization kryo

对于个人项目,我必须使用 Kryo-Framework 在 Java 中序列化 Collections.sychronizedMap。我绑定(bind)到该框架,因为还有其他依赖项需要它。我目前的尝试如下:

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 上的put 方法时,就会引发NullPointerException。原因似乎是synchronizedMap 使用的内部映射,因为反序列化后它为空。但我的错误在哪里呢?我能以某种方式让这段代码工作吗?

最佳答案

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

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

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

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

关于java - 使用 Kryo 序列化同步映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50366853/

相关文章:

java - 在 xsd 上使用 xjc 时缺少包装类

.Net 二进制反序列化运行时平台的故障检测/取证

java - 使用 Jackson 进行反序列化 : get list of fields set by Json object

android - Proguard 混淆使我的基于通信的应用程序的更新版本成为 'impossible' 以与旧版本的消息传递兼容

c# - < Material xmlns ='x' > 不是预期的

java - SQLiteAssetHelper - 如何使用 AssetHelper 将新数据插入现有数据库?

java - 如何使用spark java api在cassandra表中进行平均值、最大总和等聚合

Java:字符串:equalsIgnoreCase vs 将所有内容切换为大写/小写

serialization - 实际使用 Lua 协程/延续序列化来简化异步逻辑?

c# - 是否可以使用 .net 提供的序列化属性将 xml 反序列化为 List 对象?