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 编译器如何区分不同的服务及其具有相同标识符/标签的消息?

C ++ libcurl缓存数据响应

无法使用 Python gtfs_realtime_pb2 模块获取服务警报 Protobuff 以包含 header_text 或 description_text

protostuff序列化/反序列化

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

使用 C++ 检查并将数据添加到 protobuff