博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用kryo反序列化时unmodifiedList报错
阅读量:6687 次
发布时间:2019-06-25

本文共 1282 字,大约阅读时间需要 4 分钟。

前言

前端时间遇到proto模型在kryo下反序列化失败问题,查了下原因,总结一下

重现

序列化的对象如下

public class MixedData{private Proto.RepeatedModel protoData;private int normalData;}复制代码

proto模型定义如下

message RepeatedModel {repeated int32 data;}复制代码

关键报错信息如下

Caused by: java.lang.UnsupportedOperationException    at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)    at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:109)    at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:22)    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:679)    at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)    ... 48 more复制代码

原因很清楚, 对于repeated字段,proto编译生成的是UnmodifiedList,kryo中没有注册UnModifiedList的序列化器,使用了CollectionSerializer去做序列化,CollectionSerializer的反序列化策略关键点如下

for (int i = 0; i < length; i++)					collection.add(kryo.readObject(input, elementClass, serializer));复制代码

这里的collection是由序列化使用的list类型决定的,在本文就是UnmodifiableCollection,在本文就是UnmodifiableCollection进行添加操作当然会导致异常,至此一切明了.

解决方案

一个可行的解决方案如下(未测试) 添加如下依赖

de.javakaffee
kryo-serializers
0.42
复制代码

在kryo配置处注册serializer

this.register(UnmodifiableCollectionsSerializer.class);复制代码

转载地址:http://sueao.baihongyu.com/

你可能感兴趣的文章
在另一个类中做数据成员的对象,可以先不初始化
查看>>
最终类final
查看>>
Springboot开启事务
查看>>
广搜——三维迷宫
查看>>
安装OpenCV3.1 与VS2015配置主要步骤
查看>>
mian函数接受两个实参,&nbsp;连成s…
查看>>
mssql timeout 超时时间已到
查看>>
Linux系统——C/C++开发工具及环境搭建
查看>>
LVS负载均衡
查看>>
1.4(Spring学习笔记)Spring-JDBC基础
查看>>
[研究笔记]n个骰子得到点数和的概率分布
查看>>
让你写的代码“说话”
查看>>
C#基础 常用语&数据类型定义&类型转换
查看>>
字典的操作
查看>>
关于使用Html5 canvas、 map、jquery构造不规则变色点击区域 热点区域
查看>>
Mining Massive Data Sets PPT
查看>>
python迭代器和生成器
查看>>
Android 2.3预计下周发布 十大惊“.NET研究”喜不容错过
查看>>
艾伟:WCF从理论到实践(15):响应变化
查看>>
艾伟也谈项目管理,项目经理的思维批判
查看>>