「周末福报」如何高效使用 Kryo
时间:2022-07-24
本文章向大家介绍「周末福报」如何高效使用 Kryo,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Kryo 本身是多线程不安全的。
捣鼓、尝试了两种处理方式:ThreadLocal、KryoPool。
ThreadLocal
public class KryoUtil {
final static ThreadLocal<Kryo> kryoLocal = new ThreadLocal<Kryo>() {
@Override
protected Kryo initialValue() {
Kryo kryo = new Kryo();
kryo.setClassLoader(Thread.currentThread().getContextClassLoader());
// 提前注册好需要处理的序列化对象
kryo.register(String.class);
kryo.register(UserDTO.class, new BeanSerializer<>(kryo, UserDTO.class));
return kryo;
}
};
public static byte[] serialize(Object object) {
Output output = new Output(new ByteArrayOutputStream());
try {
kryoLocal.get().writeObject(output, object);
return output.getBuffer();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
output.close();
output.flush();
}
}
@SuppressWarnings("unchecked")
public static <T> T deserialize(byte[] bytes, Class<?> type) {
Input input = new Input(new ByteBufferInput(bytes));
try {
Kryo kryo = kryoLocal.get();
return (T) kryo.readObject(input, type);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
input.close();
}
}
}
KryoPool
public class KryoPoolUtil {
private static Pool<Kryo> kryoPool = new Pool<Kryo>(true, false, 8) {
protected Kryo create() {
Kryo kryo = new Kryo();
kryo.setRegistrationRequired(false);
kryo.setReferences(false);
return kryo;
}
};
public static byte[] serialize(Object object) {
Kryo kryo = kryoPool.obtain();
Output output = new Output(new ByteArrayOutputStream());
try {
kryo.writeObject(output, object);
return output.getBuffer();
} finally {
kryoPool.free(kryo);
output.close();
output.flush();
}
}
@SuppressWarnings("unchecked")
public static <T> T deserialize(byte[] bytes, Class<?> type) {
Kryo kryo = kryoPool.obtain();
Input input = new Input(new ByteBufferInput(bytes));
try {
return (T) kryo.readObject(input, type);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
kryoPool.free(kryo);
input.close();
}
}
}
遇到的坑
连续处理两个对象序列化/反序列化遇到的未注册错误
解决方式:将需要处理的对象类,提前注册到 Kryo。
// 注册需要处理的类
kryo.register(String.class);
kryo.register(UserDTO.class, new BeanSerializer<>(kryo, UserDTO.class));
小结
线程不安全的类,大都可以采用以上两种方法来进行。
这个周末,又一次成功“强迫”自己学习。
感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。
- 修改Apache的超时设置,解决长连接请求超时问题
- Oracle 12cR2初体验(r11笔记第91天)
- MySQL中的undo截断(r11笔记第89天)
- Linux系统 df 命令显示异常、分区丢失问题解决
- MySQL主从、字典死锁、连接数的Python监控脚本
- MySQL Online DDL(二)(r11笔记第88天)
- 转-Android上面运行golang
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)
- MySQL 5.7 Group Replication错误总结(r11笔记第84天)
- 空结构体struct{}解析
- 动态创建MySQL Group Replication的节点(r11笔记第84天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PB 级大规模 Elasticsearch 集群运维与调优实践
- MySQL实时在线备份恢复方案
- Android通过原生请求直接获取网页内容
- matplotlib | Python强大的作图工具,让你从此驾驭图表(二)
- 设计模式 | Catalog设计模式,抵御业务方需求变动
- 【Flutter 专题】99 初识 EventBus
- LeetCode 102 | 将二叉树中同层的元素归并在一起
- Git | Git入门,成为项目管理大师(二)
- 学习|Unity3D使用协程实现减速停车效果
- R语言实现文献的批处理
- django-haystack ImportError: cannot import name 'six' from 'django.utils' in django 3.x
- Thanos 与 VictoriaMetrics,谁才是打造大型 Prometheus 监控系统的王者?
- 阅读大型开源软件的四个技巧
- Tomcat NIO(7)-Poller
- python 求解线性规划问题