之前在工作中用到了protocol buffer(此处简称PB)(主要对数据进行序列化与反序列化,方便网络传输中的编解码),之后发现这是一个好东西,在此稍微记录下该工具如何使用,方便以后查阅

  官网地址(需 翻 墙):https://developers.google.com/protocol-buffers/docs/downloads

  • 准备工作

  在工程中使用PB ,首先需要准备好PB运行时库文件(.jar)文件,和PB编译器(protoc.exe,用于自动生成代码)

  官网下载下来的PB源文件,需要编译打包成“.jar”文件,这样才能在之后的java工程中调用,此处介绍下打包PB源文件的 过程(解压缩包根目录下README.MD 以及 java/README.MD文件有详细介绍如何下载pb编译器及打包源码过程)

    • 官网下载PB源文件和PB编译器程序(源文件和编译器版本必需一致)
    • 打包PB源文件生成.jar文件步骤

  下载下来的源文件解压后目录结构如下所示 :

  将解压得到的PB编译器“protoc.exe”拷贝到上图所示的“src"目录(必需执行该操作,否则之后的mvn操作会失败)

  进入上图所示的“java”目录,执行:mvn clean package,编译成功后便可在“target”目录下看见生成的.jar运行库文件。

至此打包生成库文件完成,之后便可调用生成的.jar文件。

  protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台,由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域,官网支持java、c++python,三种语言的实现。

  下面介绍一下PB如何使用 :

  • 首先 创建扩展名为.proto的文件(一个文件可定义多个message) ,例如 :  test.proto
message Login {
required string account = ; //用户名
optional string password = ; //密码,默认没有
optional int32 version = ; //版本号码
required string platform = ; // “brew”
required string device = ; // “HS001C”,后面可能需要区分手持机还是车机
optional string meid = ; // meid字串
optional uint32 expect_payload = [default = ]; //101指AMR,111是EVRC
} message LoginAck {
required int32 result = ; //-1代表失败,>=0 代表成功
required User usr = ;
required Configure conf = ;
optional ServerInfo tcp_server = ; // TCP 服务器
optional ServerInfo udp_server = ; // UDP 服务器
optional ServerInfo update_server = ; // 升级服务器
optional uint32 cookie = ; //随机种子
} message QueryGroup {
enum DetailLevel {
ONLY_ID = ;
GROUP_INFO = ;
}
required DetailLevel detail = [default = GROUP_INFO]; //是只返回群组ID还是带群组名称的,默认是带名称的
optional bool include_temp = [default = false]; //是否包括临时群组,默认是不包括的
} message QueryGroupAck {
required int32 result = ; //-1:fail >=0 succ
repeated Group groups = ;
}

  

        

        Scalar Value Types

    A scalar message field can have one of the following types – the table shows the type specified in the .proto file, and the corresponding           type in the automatically generated class:

  • 使用protoc.exe(网上可下载)编译器自动生成相应语言的代码

  命令行执行 : protoc.exe --java_out=./xxx.jar test.proto

          protoc.exe --java_out=./  test.proto

  • 使用生成的源码文件或jar文件

    • 序列化举例(将上面定义的Login序列化为字节数组) :
Login.Builder builder = Login.newBuilder();
builder.setAccount(userName);
builder.setPlatform("brew");
builder.setDevice("HS001C");
builder.setPassword(pwd);
Login login = builder.build();
byte[] loginBt = login.toByteArray();
    • 反序列化举例(将字节数组反序列化为LoginAck对象,方便获取对象中的值):
LoginAck loginAck = LoginAck.parseFrom(byteArray.getArray(byteArray.length() - ));

int result = loginAck.getResult();

至此,PB使用基本介绍完成,下面贴出PB官网java 教程 :

protocol buffer使用简介的更多相关文章

  1. Protocol Buffer使用

    Protocol Buffer使用简介 字数2630 阅读5067 评论1 喜欢12 我们项目中使用protocol buffer来进行服务器和客户端的消息交互,服务器使用C++,所以本文主要描述pr ...

  2. 后端程序员之路 31、Protocol Buffer

    google/protobuf: Protocol Buffers - Google's data interchange formathttps://github.com/google/protob ...

  3. protocol buffer简介

    一.protocol buffer简介 protocol buffer(简称PB)是google开源的一个数据序列化与反序列化工具,由于其支持多种语言.各种平台,多被用于对象的存储,远程调用等方向.用 ...

  4. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  5. Google Protocol Buffer 的使用

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

  6. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  7. Google Protocol Buffer 协议

    1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...

  8. 【Google Protocol Buffer】Google Protocol Buffer

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...

  9. iOS 开发之 protocol Buffer 数据交换

    前言: 从 14 年公司做项目时开始接触 Google 的 protocol Buffer,用了一段时间,后来到新公司就没有机会再使用了,趁着还没完全忘记,记录下. 简介:protocolbuffer ...

随机推荐

  1. BZOJ 1067 降雨量

    Description 我们常常会说这样的话:"\(X\)年是自\(Y\)年以来降雨量最多的".它的含义是\(X\)年的降雨量不超过\(Y\)年,且对于任意\(Y<Z< ...

  2. Rectangle Area——LeetCode

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  3. poj3261 Milk Patterns(后缀数组)

    [题目链接] http://poj.org/problem?id=3261 [题意] 至少出现k次的可重叠最长子串. [思路] 二分长度+划分height,然后判断是否存在一组的数目不小于k即可. 需 ...

  4. Windows Shell Extension 系列文章

    Windows Shell Extension 系列文章 http://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-C ...

  5. [Locked] Group Shifted Strings

    Group Shifted Strings Given a string, we can "shift" each of its letter to its successive ...

  6. JSTL和select标签的组合使用

    1.用于根据不同的值显示对应的内容,不能选择 <select name="grade"> <c:choose> <c:when test=" ...

  7. [转]【基于zxing的编解码实战】精简Barcode Scanner篇

    通过<[搞定条形码]zxing项目源码解读(2.3.0版本,Android部分)>的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分 ...

  8. 解决"the currently displayed page contains invalid values"

    原因是你的工程的根目录少了default.properties(有点项目工程这个文件名称是project.properties)这个文件,导致不能选择target:   解决办法: 在工程根目录下建立 ...

  9. 自己动手写shell之chgrp,chown,chmod

    1.chgrp实现 #include <grp.h> #include <unistd.h> void chgrp(char * groupname,char * filena ...

  10. Java EE的十三种核心技术

    1. JDBC: Java Database Connectivity 2. JNDI: Java Name and Directory Interface 3. EJB: Enterprise Ja ...