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

使用Protostuff实现序列化与反序列化使用Protostuff实现序列化与反序列化(1)Protobuf介绍GoogleProtocolBuffer(简称Protobuf)是Google公司内部的混合语言数据标准,目前已经正在使用的有超过48,162种报文格式定义和超过12,183个.proto文件。他们用于RPC系统和持续数据存储系统。ProtocolBuffers是一种轻便高效的结构化数…

大家好,又见面了,我是你们的朋友全栈君。

使用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 {

    @Test
    public 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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136470.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月4日 下午5:00
下一篇 2022年5月4日 下午5:00


相关推荐

  • 服务器证书类型有哪些

    服务器证书类型有哪些安装在网站上的服务器证书还有另一称谓就是 SSL 证书 我们在购买这一证书的时候 关键的一点是要明确服务器证书类型 才能为网站挑选到适合的 SSL 证书 那么 服务器证书类型有哪些 今天小编就来为各位介绍下 服务器证书类型有哪些服务器证书分为域名型证书 组织型证书 扩展型证书三种 该如何选择往往取决于网站的应用场景 常用的 SSL 证书主要是域名型证书 DV 分为三种 单域名证书 多域名证书 通配符证书 从字面意思我们也能大概理解单域名证书就是只针对用户只有一个域名的情况 一个域名对应一个证书 通常用于比

    2025年11月18日
    5
  • matlab griddata外插,matlab griddata方法使用介绍

    matlab griddata外插,matlab griddata方法使用介绍griddata的作bai用是数据网格化。其一般用du法格式为ZI=griddata(x,y,z,XI,YI)%x、y、z——数据,XI,YI——X-Y平面上的zhi网格数据应用实例:dao>>x=rand(100,1)*4-2;y=rand(100,1)*4-2;>>z=x.*exp(-x.^2-y.^2);>>ti=-2:.2…

    2022年5月9日
    569
  • java类加载器是什么_类加载器有几种

    java类加载器是什么_类加载器有几种类加载器是有了解吗?解析:底层原理的考察,其中涉及到类加载器的概念,功能以及一些底层的实现。答:顾名思义,类加载器(classloader)用来加载Java类到Java虚拟机中。一般来说,Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取Java…

    2022年8月11日
    8
  • JSONArray和JSONObject的转换

    JSONArray和JSONObject的转换在项目日常开发中常常会遇到JSONArray和JSONObject的转换,很多公司刚入职的小萌新会卡在这里,今天和大家分享一下,有更厉害的大佬也可以指教一下!话不多说上硬菜publicstaticvoidmain(String[]args){Stringstr=“{“took”:26,“tid_out”:fale,”_shards”:{“total”:160,“succssf…

    2022年5月2日
    378
  • Google搜索语法_谷歌高级搜索怎么用

    Google搜索语法_谷歌高级搜索怎么用Google搜索技巧是利用各种高级搜索语法或者搜索指令,让我们能够使用谷歌进行精确化的搜索,外贸找客户和学术文件查找都可以应用到这些搜索技巧。搜索技巧#1:关键词精确查询使用谷歌搜索时,用英文引号把关键词框起来,Google会进行完全匹配的精确搜索,搜索结果中的页面会包含完整的关键词或者词组。搜索实例比如,我们想要查找谷歌站长工具相关的信息,不限定网页的类型,但必须包含“谷歌站长工具”这个完整的词汇。语法指令“谷歌站长工具”搜索结果搜索技巧#2:OR选择查询一般情况

    2022年8月30日
    6
  • Android开发ListView使用OnScrollListener实现分页加载数据

    Android开发ListView使用OnScrollListener实现分页加载数据

    2022年1月17日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号