Google ProtoBuff 获取、编译、使用示例

来源:互联网 发布:语c kg是什么意思网络 编辑:程序博客网 时间:2024/06/05 13:58

Google ProtoBuff入手

简介

    [Google Protocol Buffer](https://developers.google.com/protocol-buffers/)( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 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/javamaven 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: 12345Phone: 13752526262Email: "151221@qq.com"Sex: true将User对象序列化为字节数组[B@49c2faae将User对象的序列化字节数组反序列化为java对象ID: 12345Phone: 13752526262Email: "151221@qq.com"Sex: true
0 0
原创粉丝点击