io.protostuff.ProtostuffIOUtil序列化
简介:
Protostuff是谷歌产品,用于高效处理对象的序列化和方序列化
那这个Schema是什么呢?就是一个组织结构,就好比是数据库中的表、视图等等这样的组织机构,在这里表示的就是序列化对象的结构
pom坐标:
<dependency><groupId>io.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.6.0</version>
</dependency>
<dependency><groupId>io.protostuff</groupId><artifactId>protostuff-runtime</artifactId><version>1.6.0</version>
</dependency>
proStuff工具类
序列化方法,里面的代码很容易理解,首先获得要序列化对象的类,然后为其分配一个缓存空间,其次获得这个类的Schema。最后一行代码ProtostuffIOUtil.toByteArray进行序列化
反序列里面的代码更简单了,首先根据序列化对象获取其组织结构Schema。然后根据byte直接mergeFrom成一个对象
public class ProtostuffUtils {//避免每次序列化都重新申请Buffer空间private static LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);//缓存Schemaprivate static Map<Class<?>, Schema<?>> schemaCache = new ConcurrentHashMap<Class<?>, Schema<?>>();//序列化方法,把指定对象序列化成字节数组@SuppressWarnings("unchecked")public static <T> byte[] serialize(T obj) {Class<T> clazz = (Class<T>) obj.getClass();Schema<T> schema = getSchema(clazz);byte[] data;try {data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);} finally {buffer.clear();}return data;}//反序列化方法,将字节数组反序列化成指定Class类型public static <T> T deserialize(byte[] data, Class<T> clazz) {Schema<T> schema = getSchema(clazz);T obj = schema.newMessage();ProtostuffIOUtil.mergeFrom(data, obj, schema);return obj;}@SuppressWarnings("unchecked")private static <T> Schema<T> getSchema(Class<T> clazz) {Schema<T> schema = (Schema<T>) schemaCache.get(clazz);if (schema == null) {schema = RuntimeSchema.getSchema(clazz);if (schema != null) {schemaCache.put(clazz, schema);}}return schema;}
}
案例运用:在上下问中获取运用后台登录用户信息
@Component
@Slf4j
@Order(-1)
@ConditionalOnBean(RedisCacheStorage.class)
public class NewSessionContextFilter{// 定义schemaprivate static final RuntimeSchema<OperationBO> SCHEMA = RuntimeSchema.createFrom(OperationBO.class);// 获取数据,反序列化private void yopContext(HttpServletRequest request){Cookie[] cookies = request.getCookies();if (!Util.isEmpty(cookies)) {String sessionId = "";Cookie[] var4 = cookies;int var5 = cookies.length;for (int var6 = 0; var6 < var5; ++var6) {Cookie cookie = var4[var6];if (cookie.getName().equals("SESSIONID")) {sessionId = new String(Base64.getDecoder().decode(cookie.getValue()));}}byte[] adminBytes = this.redisCacheStorage.get(sessionId.getBytes());OperationBO operationBO = null;log.info("SessionContextFilter:{}",new String(adminBytes== null ? new byte[]{} : adminBytes));if (!Util.isEmpty(adminBytes)) {operationBO = SCHEMA.newMessage();ProtostuffIOUtil.mergeFrom(adminBytes, adminUserContext, SCHEMA);ContextHolder.setContext(AdminUserContext.convert(operationBO));}}}
保存获取的用户信息:
public class ContextHolder {private static final ThreadLocal<OperationBO> contextHolder = new ThreadLocal<OperationBO>() {/*** * 默认数据*/@Overrideprotected OperationBO initialValue(){return new OperationBO(0L,"admin");}};/*** 切换数据源* @param key*/public static void setContext(OperationBO key) {contextHolder.set(key);}/*** 获取数据源* @return*/public static OperationBO getContext() {return contextHolder.get();}/*** 重置数据源*/public static void clearContext() {contextHolder.remove();}}
实体类:
@Data
public class OperationBO implements Serializable {// 登录人idprivate Long operationId;// 登录人姓名private String operationName;}
业务代码中直接获取,不再需要没次从参数中传入:
OperationBO operationBO = ContextHolder.getContext();
io.protostuff.ProtostuffIOUtil序列化相关推荐
- 使用Protostuff实现序列化与反序列化
使用Protostuff实现序列化与反序列化 (1)Protobuf介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已 ...
- protostuff java_Protostuff序列化和反序列化的使用说明
大家都知道protobuf好用,可是在网上找到的netty整合protobuf的文章都是千篇一律,自己编写proto文件然后使用工具转java文件用起来复杂麻烦,经过不懈努力终于找到了一个简单的方法希 ...
- 使用protostuff进行序列化
2019独角兽企业重金招聘Python工程师标准>>> 使用protostuff进行序列化 博客分类: java 按官方的说法,protostuff是一个序列化库,提供了向后兼容和验 ...
- 【小白学Java】D32》》》IO流 之 序列化流 打印流
[友情链接]➡➡▶IO流 之 File类 & 递归 [友情链接]➡➡▶IO流 之 过滤器 & 字节流 [友情链接]➡➡▶IO流 之字符流 & 属性集(Properties集合) ...
- jackson、fastjson、kryo、protostuff等序列化工具性能对比
简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...
- java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...
一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...
- IO对象流(序列化和反序列化)
序列化和反序列化概念: 序列化: 把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络的节点(在网络上传输) 反序列化: 把磁盘文件中的对象数据或者网络节点上的对象数据, ...
- Java 持久化操作之 --io流与序列化
摘自:http://www.cnblogs.com/lsy131479/p/8728724.html 1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsol ...
- IO流 ---有用 序列化和transient问题
1. 异常 1.1 概述 观察如下的代码, 看有无问题: int a = 10;int b = 0;System.out.println(a / b); 我们发现, 上述代码的第3行会报错, 即: 算 ...
最新文章
- 解决linux下中文文件名显示乱码问题
- python语言实例-Python与其他语言比较实例
- cocos lua 创建替换图片
- numpy的array合并-【老鱼学numpy】
- python数据导出excel_python 数据生成excel导出(xlwt,wlsxwrite)代码实例
- 【Notes6】ajaxjson,校验用户名,自动提示,CORS,/swagger开发rest,Websocket,DNS
- Socket编程实践(13) --UNIX域协议
- bzoj3238 [Ahoi2013]差异 后缀自动机
- 荣耀50系列完整规格曝光:Vlog至美之作
- PL/SQL Developer-官网下载地址
- Android* 操作系统上的应用程序远程调试
- UwpDesktop!WPF也能开发Surface Dial
- 欧姆龙plc交互协议hostlink
- 干货分享!12款响应式的移动网站模板免费下载
- SQL Server2008 附加数据库时出错
- Algorithms-3.3补充 Geometric Applications of BSTs 二叉树的几何应用
- PHP 对和队列的区别,【php】Redis的队列和消息队列的区别是什么?
- ios 截屏保存图片
- word中全部数字、大小写字母、标点更改为新罗马字体Times News Romans
- win7安装JAVA程序闪退怎么办_win7打开软件闪退如何解决
热门文章
- rabbitmq vhost
- OSSEC服务端配置客户端批量部署方案
- 过度拟合_过度拟合和尺寸缩减的过度拟合的最终指南
- 2022-2027年中国菊芋行业市场调研及未来发展趋势预测报告
- linux命令查硬盘wwn,如何查看linux/unix查看wwn号
- Java获取当天或者明天等零点时间(00:00:00)0时0分0秒的方法
- 2022年9月12日-9月18日(ue4热更新视频教程+rhi模块源码抄写调剂。本周20小时。合计1582小时,剩余8418小时。)
- TextRank论文阅读
- 安卓模拟器报错:Error while waiting for device: The emulator process for AVD Nexus_6P_API_30 has terminated.
- iOS 仿微信相册选择照片imagePicker(Swift) 序号 预览缩略图