之前在工作中用到了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. protocol buffer简介

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

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

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

  4. Google Protocol Buffer 的使用

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

  5. Google Protocol Buffer 的使用和原理

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

  6. Google Protocol Buffer 协议

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

  7. 【Google Protocol Buffer】Google Protocol Buffer

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

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

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

  9. Netty对Protocol Buffer的支持(七)

    Netty对Protocol Buffer的支持(七) 一.简介 在上一篇博文中笔者已经介绍了google的Protocol Buffer的使用,那么本文笔者就开始介绍netty对Protocol B ...

随机推荐

  1. logging 模块误用导致的内存泄露

    首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging ...

  2. Linux 网络编程详解二(socket创建流程、多进程版)

    netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...

  3. hiho一下 第六十六周

    题目链接:这是一道水爆了的广搜题 #include<iostream> #include<stdio.h> #include<algorithm> #include ...

  4. 如何配置全世界最小的 MySQL 服务器

    配置全世界最小的 MySQL 服务器——如何在一块 Intel Edison 为控制板上安装一个 MySQL 服务器. 介绍 在我最近的一篇博文中,物联网,消息以及 MySQL,我展示了如果 Part ...

  5. .Net 调式案例—实验4 高CPU(High CPU)回顾

    原文地址:http://blog.csdn.net/directionofear/article/details/8033506 如果Web应用程序经常遇到的问题按频率排名的话,我觉得 第一名unha ...

  6. MySQL中的数值函数

    加减乘除(+.-.*./)均可用于数值计算. SELECT (1 + 1) / (1 * 2.2 - 3) 执行算术函数 单参数数值函数举例: acos(x), asin(x), atan(x), c ...

  7. 3.1依赖注入「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 从UML来理解依赖 1.1什么是依赖 我们先看下图 可以简单理解,一个HomeController类使用到了DBC ...

  8. Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制

    摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能 ...

  9. python flask里 post请求,JSON数据获取方式总结

    #!flask/bin/python #encodig=utf-8 # _*_ coding:utf-8 _*_ # Writer : byz # dateTime : 2016-08-05 from ...

  10. 微信小程序开发——点击按钮获取用户授权没反应或反应很慢的解决方法

    异常描述: 点击按钮获取用户手机号码,有的时候会出现点击无反应或很久之后才弹出用户授权获取手机号码的弹窗,这种情况下,也会出现点击穿透的问题(详见:微信小程序开发——连续快速点击按钮调用小程序api返 ...