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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 什么是Web 2.0——下一代软件的设计模式和商业模式 (全文翻译—1 博客版序)

    什么是Web 2.0——下一代软件的设计模式和商业模式 (全文翻译—1 博客版序)这篇文章,是经O’Reilly公司的TimO’Reilly先生授权后,进行全文翻译、出版的。包括:杂志节选版和网络全文版。转载:请遵循CC版权,保留原文作者和翻译作者信息,以及文章链接。感谢:互联网周刊的李洋提供了许多建议。几个文章版本链接:英文原文:http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/

  • SetCapture和ReleaseCapture

    SetCapture和ReleaseCapture函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。  函数原型:HWNDSetCapture(HWNDhwnd);  参数:  hWnd:当前线程里要捕获鼠标的

  • pycharm mac 激活码【2021最新】

    (pycharm mac 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html4M7HSKPBXS-eyJsa…

  • Java中Ajax学习「建议收藏」

    Java中Ajax学习「建议收藏」1.Ajax:异步js和xml异步刷新:如果网页中某一个地方需要修改,异步刷新可以使,只刷新该需要修改的地方,而页面其他中的地方保持不变。例如:百度搜索框,视频的点赞等实现(两种方式):Js:XMLHttpRequest对象XMLHttpRequest对象的方法:open(方法名【提交方式get或者post】,服务器地址,ture【是否选用异步刷新,99%都是ture】):与服务端建立连接send():get: send(null)post: send(参数值)setRequestHe

  • 自动化渗透测试系统_自动化测试用例管理工具

    自动化渗透测试系统_自动化测试用例管理工具一.渗透测试“三板斧”1.信息搜集——全面了解系统网络信息:DNSIP端口服务器信息:操作系统版本服务中间件;版本WEB系统信息:使用技术部署系统数据库第三方软件:版本社工记录:个人邮件地址泄露账号密码历史网站信息2.漏洞利用——占领根据地web漏洞发现系统漏洞发现漏洞利用编写自动漏洞利用脚本放置隐蔽后门3.横向扩展——扩大成果,深度挖掘内网架构分析、攻陷信息中心和数据中心、突破认证服务器(AD域)、内网中间人攻击(获取单点信息)、多级多点后

  • Java课程设计之 学生成绩管理系统「建议收藏」

    Java课程设计之 学生成绩管理系统「建议收藏」实现内容:设计开发一个学生成绩管理系统(1)根据实现的功能,划分出合理的对象类,明确各个对象类之间的关系。为各个对象类设计正确的域和方法,为每个方法设计合理的方法体。同时,为对象类及内部的域和方法运用正确的修饰符。功能要求:(1)录入成绩(2)查询成绩(3)成绩排序(4)修改成绩(5)删除成绩(6)将数据保存在数据库表中该课程设计涉及MySQL数据库,建表操作,java操作SQL语句(JDBC数据库操作)以及JavaS

发表回复

您的电子邮箱地址不会被公开。

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