博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Protocol Buffer在Java中的使用方式
阅读量:2068 次
发布时间:2019-04-29

本文共 2479 字,大约阅读时间需要 8 分钟。

序言

Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,但它们的数据格式有比较大的区别:

  • 首先,Protocol Buffer 序列化之后得到的数据不是可读的字符串,而是二进制流
  • 其次,XML 和 JSON 格式的数据信息都包含在了序列化之后的数据中,不需要任何其它信息就能还原序列化之后的数据;但使用 Protocol Buffer 需要事先定义数据的格式(.proto 协议文件),还原一个序列化之后的数据需要使用到这个定义好的数据格式(网上很多java的使用方法介绍。首先就是编辑一个proto的数据结构文件,就像是一个java domain 类。后面就是针对该domain类进行 设置属性值和获取属性)
  • 最后,在传输数据量较大的需求场景下,Protocol Buffer 比 XML、JSON 更小(3到10倍)、更快(20到100倍)、使用 & 维护更简单;而且 Protocol Buffer 可以跨平台、跨语音使用(车载终端是直接穿的2进制数据,速度和Protocol Buffer是一样的)

通过将结构化的数据(拥有多种属性)进行序列化,从而实现(内存与硬盘之间)数据存储和交换的功能(这个东西的使用除非修改原有的数据结构否则几乎不会改动,就是获取对象类属性和设置对象属性)

  • 序列化: 按照 .proto 协议文件将数据结构或对象转换成二进制流的过程
  • 反序列化:将在序列化过程中所生成的二进制流转换成数据结构或对象的过程

 

实现方式

目前实现方式有2种:

  • 一种是用google的命令将.proto文件转换成 JavaBean文件
  • 另外一种就不需要依赖.proto文件了,可以直接对POJO进行序列化和反序列化,使用起来非常简单。

 

第一种

先定义.proto文件,然后编译成javabean. 在序列化和反序列化.~~~~这个很简单

public class Test {    public static void main(String[] args) throws IOException {        UserOuterClass.User.Builder userBuilder = UserOuterClass.User.newBuilder();        userBuilder.setName("子悠");        userBuilder.setAge(18);//        userBuilder.setComment("this is comment");        System.out.println("\n**********************序列化*****************************");        byte[] bytes = userBuilder.build().toByteArray();        System.out.println("bytes length is " + bytes.length);        for (int i = 0; i < bytes.length; i++) {            System.out.print(bytes[i] + " ");        }        System.out.println("\n**********************反序列化*****************************");        UserOuterClass.User user = UserOuterClass.User.parseFrom(bytes);        System.out.println(user.getName());    }}

protobuf文件语法

文件结构

 

//指定版本	syntax = "proto2";	//定义包名	package com.test.model;		// 生成的包名option java_package="com.pancm.protobuf";//生成的java名//注:这里使用的是proto3,相关的注释我已写了,这里便不再过多讲述了。需要注意一点的是proto文件和生//成的Java文件名称不能一致!option java_outer_classname = "UserInfo";//定义结构数据	message User {	    //必选字段 第1个属性	    required string name = 1;	    //必选字段 第2个属性	    required int32 age = 2;	    //可选字段 第3个属性	    optional string comment = 3;	}

数据类型

.proto Type Java Type
double double
float float
int32 int
int64 int
uint32 int
uint64 long
sint32 int
sint64 long
fixed32 int
fixed64 long
sfixed32 int
sfixed64 long
bool boolean
string String
bytes Byte/String
map<T,T> java.util.Map<T,T>

转换工具下载与使用

下载地址

转换命令

把.proto文件和protoc.exe(生成Java文件的软件)放到E盘目录下的protobuf文件夹下,然后再到该目录的dos界面下输入:protoc.exe --java_out=文件绝对路径名称

例如(输入完之后,回车即可在同级目录看到已经生成好的Java文件,然后将该文件放到项目中该文件指定的路径下即可。):

protoc.exe --java_out=E:\protobuf Test.proto

第二种

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://xbcmf.baihongyu.com/

你可能感兴趣的文章
关于Oracle数据库优化的几点总结
查看>>
69道Spring面试题和答案
查看>>
40个Java多线程问题总结
查看>>
Oracle数据库面试题
查看>>
java面试中的智力题
查看>>
本地如何连接hbase数据库
查看>>
Maven出错-Missing artifact org.apache.openejb:openejb-core:jar:4.1.0-SNAPSHOT:test
查看>>
dubbo配置文件xml校验报错
查看>>
eclipse生成export生成jar详解
查看>>
oracle 模糊查询忽略大小写
查看>>
Java项目导出可运行的jar文件
查看>>
Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析),兼容Windows和Linux
查看>>
JAVA读取PROPERTIES配置文件
查看>>
Linux中执行shell脚本的4种方法总结
查看>>
BufferedInputStream(缓冲输入流)详解
查看>>
修改linux文件权限命令:chmod
查看>>
Linux vi/vim编辑器常用命令与用法总结
查看>>
如何使用Git Bash Here,将本地项目传到github上
查看>>
eclipse git控件操作 回退到历史提交 重置 删除(撤销)历史的某次提交
查看>>
Oracle | 给表和字段添加注释
查看>>