使用Protostuff实现序列化与反序列化
(1)Protobuf介绍

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

(2)Protobuf优点

平台无关,语言无关,可扩展;
    提供了友好的动态库,使用简单;
    解析速度快,比对应的XML快约20-100倍;
    序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10;
    独立于语言,独立于平台,最最重要的是它的效率相当高,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,

(3)Protobuf主要流程

需要自己写一个.proto文件用来描述序列化的格式,然后用Protobuf提供的protoc工具将.proto文件编译成一个Java文件,最后将该Java文件引入到项目中就可以了。

(4)Protostuff介绍

google原生的protobuffer使用起来相当麻烦,首先要写.proto文件,然后编译.proto文件,生成对应的.java文件。protostuff基于Google Protobuf,好处就是不用自己写.proto文件同时在几乎不损耗性能的情况下即可实现对象的序列化与反序列化。

(5)使用Protostuff示例

Protostuff版本:

使用Protostuff实现Jedis中Club对象的读取:

代码结构为:

序列化工具类ProtostuffSerializer 提供了序列化和反序列化方法:
 
    // 序列化工具
    public byte[] seriable(final Club club) {
        final LinkedBuffer linkedBuffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
        try {
            return serializeInternal(club, schema, linkedBuffer);
        } catch (final Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        } finally {
            linkedBuffer.clear();
        }
    }
    
    // 实际序列化工具
    private <T> byte[] serializeInternal(final T source, final Schema<T> schema, final LinkedBuffer linkedBuffer) {
        return ProtostuffIOUtil.toByteArray(source, schema, linkedBuffer);
    }
    
    // 反序列化工具
    public Club deserialize(final byte[] bytes) {
        try {
            Club club = deserializeInternal(bytes, schema.newMessage(), schema);
            if (club != null) {
                return club;
            }
        } catch (final Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
        return null;
    }
    
    // 实际反序列化工具
    private <T> T deserializeInternal(final byte[] bytes, final T result, final Schema<T> schema) {
        ProtostuffIOUtil.mergeFrom(bytes, result, schema);
        return result;
    }

应用:

<!-- https://mvnrepository.com/artifact/io.protostuff/protostuff-core -->
<dependency><groupId>io.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.6.0</version>
</dependency><!-- https://mvnrepository.com/artifact/io.protostuff/protostuff-runtime -->
<dependency><groupId>io.protostuff</groupId><artifactId>protostuff-runtime</artifactId><version>1.6.0</version>
</dependency>
package com.java.mailbox.utils;import io.protostuff.LinkedBuffer;
import io.protostuff.ProtobufIOUtil;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;/*** @Author: 束手就擒* @Date: 18-8-25 下午8:05* @Description:*/
public class ObjectSerializeUtil {/*** 序列化* @param o* @param <T>* @return*/@SuppressWarnings("unchecked")public static <T> byte[] serializer(T o) {Schema schema = RuntimeSchema.getSchema(o.getClass());return ProtobufIOUtil.toByteArray(o, schema, LinkedBuffer.allocate(256));}/*** 反序列化* @param bytes* @param clazz* @param <T>* @return*/@SuppressWarnings("unchecked")public static <T> T deserializer(byte[] bytes, Class<T> clazz) {T obj = null;try {obj = clazz.newInstance();Schema schema = RuntimeSchema.getSchema(obj.getClass());ProtostuffIOUtil.mergeFrom(bytes, obj, schema);} catch (IllegalAccessException | InstantiationException e) {e.printStackTrace();}return obj;}
}

测试:

package com.java.mailbox.obj;import com.java.mailbox.utils.ObjectSerializeUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.Arrays;import static org.junit.Assert.*;/*** @Author: 束手就擒* @Date: 18-8-25 下午8:36* @Description:*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentTest {@Testpublic void hhh() {Student student = Student.builder().userName("束手就擒").userAge(20).userGender("Male").build();byte[] serializate = ObjectSerializeUtil.serializer(student);System.out.println("serialize = "+ Arrays.toString(serializate));Student studentB = ObjectSerializeUtil.deserializer(serializate,Student.class);System.out.println("studentB = "+studentB.toString());}}

结果:

2018-08-25 21:05:00.045  INFO 7815 --- [           main] com.java.mailbox.obj.StudentTest         : Started StudentTest in 11.407 seconds (JVM running for 14.519)
serialize = [10, 12, -26, -99, -97, -26, -119, -117, -27, -80, -79, -26, -109, -110, 18, 4, 77, 97, 108, 101, 24, 20]
studentB = Student(userName=束手就擒, userGender=Male, userAge=20)

使用Protostuff实现序列化与反序列化相关推荐

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

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

  2. Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...

  3. 序列化与反序列化之 Protostuff

    一 序列化与反序列化 在大型开发中,序列化与反序列化是一个常见的技术点和问题.在之前我们对序列化与反序列化有过相关描述,但并不系统,更偏重于原理介绍.这里,我们讲详细介绍序列化与反序列化的更多场景和应 ...

  4. java get方法不序列化_java常用序列化与反序列化方法

    序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil { private ...

  5. Kafka消息序列化和反序列化(下)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. Kafka消息序列化和反序列化(上)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. 使用protostuff进行序列化

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

  8. Java之序列化和反序列化

    字符流和字节流,他们的操作对象是:字节(二进制),字符 序列化和反序列化的操作主体对象是:对象和二进制 什么是序列化和反序列化? 序列化:将对象转换成二进制 反序列化:从二进制中将二进制转换成对象(类 ...

  9. java常用序列化与反序列化方法

    序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil {private ...

最新文章

  1. 【Oracle RAC+DG实验】Oracle RAC+ASM+DataGuard配置实验记录+常见问题
  2. 取出list中属性_你是否用过List<T>和List<?>?
  3. 查看电脑python虚拟环境-手把手教你在Linux系统下使用Python虚拟环境
  4. 初学laravel migrate常见错误解决
  5. 下列不是c++ 标准数据类型得是?
  6. PAT1056 组合数的和 (15 分)
  7. C++(STL):04---智能指针之weak_ptr
  8. 平顶山学院计算机分数线,2016年平顶山学院艺术类专业录取分数线
  9. HDU 1253.胜利大逃亡
  10. (转)配置Website的IIS时遇到的问题与解决方法
  11. 创建对称矩阵(numpy)
  12. 关于ASP.NET 将数据导出成Excel 的总结[下]
  13. 大厂UI设计师vs前端工程师的沟通之道
  14. activiti7的流程图、模板图及子流程图展示
  15. 关于未来几年的发展,闰土有话要说
  16. 《文法俱乐部》读书笔记之形容词--LG二进制
  17. 微信公众平台原创声明功能公测 自媒体原创保护的福音
  18. 【论文写作】有了这些网站,可以解决论文写作中99.9%的问题!
  19. 安安猜价格聪明机器人_2021年智慧树APP不动产估价第八单元章节测试答案
  20. mysql存储过程_mysql存储过程的写法

热门文章

  1. virtio网络Data Plane卸载原理 —— vhost协议协商流程
  2. Matlab Geomap参考
  3. SDK实战(小米支付流程)
  4. VisMockup10.1安装
  5. ios相机内存_传iPhone 11 Pro配备相机专用内存
  6. 手机浏览器哪个最好用?
  7. mount -t ntfs 读写_享受更快的读写体验!技嘉黑雕AORUS Gen4 SSD 1TB评测
  8. 翼支付门户架构之搭建spring+springmvc+springsecurity框架
  9. python 安居客 爬虫_爬虫学习6:爬取安居客的VR房源信息
  10. Java多态(笔记本电脑实现usb接口)