Google ProtoBuff 获取编译使用示例
Posted 面具人生lql
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google ProtoBuff 获取编译使用示例相关的知识,希望对你有一定的参考价值。
Google ProtoBuff入手
简介
[Google Protocol Buffer](https://developers.google.com/protocol-buffers/)( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,他们用于 RPC 系统和持续数据存储系统。 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。 简单来说就是ProtoBuffer可以将一个Object序列化成二进制数据进行传输与存储,同时可以将序列化的二进制数据反序列化为特定语言的Object。ProtoBuffer优点有:序列化、反序列化速度快,序列化的数据体积小,序列化的数据是二进制数据便于高效传输存储。
下载编译
java语言使用protobuffer需要两个文件
1. protoc.exe 用于编译.proto文件生产对应语言的源代码
2. protobuf-java.jar java运行时依赖包
这两个文件都可以通过下载protobuffer源码进行编译得到
源码下载地址 https://github.com/google/protobuf
protoc.exe文件编译
cd protobuf
./configure --prefix=$INSTALL_DIR
make
make check
make install
protobuf-java.jar需要用maven编译
cd protobuf/java
maven clean package
tobuf-java.jar也可以直接使用maven依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
如果本机没有编译环境可以直接下载已便宜好的程序
下载地址:
protoc.exe
http://repo1.maven.org/maven2/com/google/protobuf/protoc/
https://github.com/google/protobuf/releases
protobuf-java.jar
http://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/
开始使用
1. 定义编写.proto文件
使用protobuffer需要先定义好需要序列化和反序列化的数据结构。用一个.proto文件来描述:
例:userInfo.proto
定义一个User类 有ID Phone Email Sex等字段 1234代表字段在源码中的位置,也是唯一标识
package demo;
message User
required int32 ID = 1;
required int64 Phone = 2;
required string Email = 3;
required bool Sex = 4;
2. 编译.proto文件生产Java源码
将.proto文件和protoc.exe文件放入同一个目录,命令行进入该目录
protoc -I=./ --java_out=./ ./userInfo.proto
执行完成之后会在当前目录下生成一个java源文件 ./demo/UserInfo.java
3. 使用示例
将UserInfo.java拷贝到java工程,并protobuf-java.jar添加到classpath
编写测试代码:
public class Demo
public static void main(String[] args) throws Exception
UserInfo.User.Builder buider=UserInfo.User.newBuilder();
buider.setID(12345).setPhone(13752526262L).setEmail("151221@qq.com").setSex(true);
UserInfo.User info = buider.build();
System.out.println("创建一个User对象\\n"+info);
System.out.println("\\n将User对象序列化为字节数组");
byte[] info_byte = info.toByteArray();
System.out.println(info_byte);
System.out.println("\\n将User对象的序列化字节数组反序列化为java对象");
System.out.println(UserInfo.User.parseFrom(info_byte));
测试运行结果:
创建一个User对象
ID: 12345
Phone: 13752526262
Email: "151221@qq.com"
Sex: true
将User对象序列化为字节数组
[B@49c2faae
将User对象的序列化字节数组反序列化为java对象
ID: 12345
Phone: 13752526262
Email: "151221@qq.com"
Sex: true
以上是关于Google ProtoBuff 获取编译使用示例的主要内容,如果未能解决你的问题,请参考以下文章
protobuff 编译器如何区分不同的服务及其具有相同标识符/标签的消息?
无法使用 Python gtfs_realtime_pb2 模块获取服务警报 Protobuff 以包含 header_text 或 description_text