简介:

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序列化相关推荐

  1. 使用Protostuff实现序列化与反序列化

    使用Protostuff实现序列化与反序列化 (1)Protobuf介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已 ...

  2. protostuff java_Protostuff序列化和反序列化的使用说明

    大家都知道protobuf好用,可是在网上找到的netty整合protobuf的文章都是千篇一律,自己编写proto文件然后使用工具转java文件用起来复杂麻烦,经过不懈努力终于找到了一个简单的方法希 ...

  3. 使用protostuff进行序列化

    2019独角兽企业重金招聘Python工程师标准>>> 使用protostuff进行序列化 博客分类: java 按官方的说法,protostuff是一个序列化库,提供了向后兼容和验 ...

  4. 【小白学Java】D32》》》IO流 之 序列化流 打印流

    [友情链接]➡➡▶IO流 之 File类 & 递归 [友情链接]➡➡▶IO流 之 过滤器 & 字节流 [友情链接]➡➡▶IO流 之字符流 & 属性集(Properties集合) ...

  5. jackson、fastjson、kryo、protostuff等序列化工具性能对比

    简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...

  6. java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...

    一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...

  7. IO对象流(序列化和反序列化)

    序列化和反序列化概念: 序列化: 把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络的节点(在网络上传输) 反序列化: 把磁盘文件中的对象数据或者网络节点上的对象数据, ...

  8. Java 持久化操作之 --io流与序列化

    摘自:http://www.cnblogs.com/lsy131479/p/8728724.html 1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsol ...

  9. IO流 ---有用 序列化和transient问题

    1. 异常 1.1 概述 观察如下的代码, 看有无问题: int a = 10;int b = 0;System.out.println(a / b); 我们发现, 上述代码的第3行会报错, 即: 算 ...

最新文章

  1. 解决linux下中文文件名显示乱码问题
  2. python语言实例-Python与其他语言比较实例
  3. cocos lua 创建替换图片
  4. numpy的array合并-【老鱼学numpy】
  5. python数据导出excel_python 数据生成excel导出(xlwt,wlsxwrite)代码实例
  6. 【Notes6】ajaxjson,校验用户名,自动提示,CORS,/swagger开发rest,Websocket,DNS
  7. Socket编程实践(13) --UNIX域协议
  8. bzoj3238 [Ahoi2013]差异 后缀自动机
  9. 荣耀50系列完整规格曝光:Vlog至美之作
  10. PL/SQL Developer-官网下载地址
  11. Android* 操作系统上的应用程序远程调试
  12. UwpDesktop!WPF也能开发Surface Dial
  13. 欧姆龙plc交互协议hostlink
  14. 干货分享!12款响应式的移动网站模板免费下载
  15. SQL Server2008 附加数据库时出错
  16. Algorithms-3.3补充 Geometric Applications of BSTs 二叉树的几何应用
  17. PHP 对和队列的区别,【php】Redis的队列和消息队列的区别是什么?
  18. ios 截屏保存图片
  19. word中全部数字、大小写字母、标点更改为新罗马字体Times News Romans
  20. win7安装JAVA程序闪退怎么办_win7打开软件闪退如何解决

热门文章

  1. rabbitmq vhost
  2. OSSEC服务端配置客户端批量部署方案
  3. 过度拟合_过度拟合和尺寸缩减的过度拟合的最终指南
  4. 2022-2027年中国菊芋行业市场调研及未来发展趋势预测报告
  5. linux命令查硬盘wwn,如何查看linux/unix查看wwn号
  6. Java获取当天或者明天等零点时间(00:00:00)0时0分0秒的方法
  7. 2022年9月12日-9月18日(ue4热更新视频教程+rhi模块源码抄写调剂。本周20小时。合计1582小时,剩余8418小时。)
  8. TextRank论文阅读
  9. 安卓模拟器报错:Error while waiting for device: The emulator process for AVD Nexus_6P_API_30 has terminated.
  10. iOS 仿微信相册选择照片imagePicker(Swift) 序号 预览缩略图