Protobuf协议,全称:Protocol Buffer 它跟JSON,XML一样,是一个规定好的数据传播格式。不过,它的序列化和反序列化的效率太变态了……

来看看几张图你就知道它有多变态。


Protobuf的Java实例

一、 安装Protobuf

去Protobuf的GitHub下载,解压。

如果你是Windows环境,则还要下载多一个东西。protobuf-2.5.0-windows.zip。

解压protobuf-2.5.0-windows.zip,把protoc.exe放在Protobuf安装目录下的src里。(其实放哪都可以)

二、 配置环境变量

编辑系统变量Path,添加Protoc.exe的存放目录。

三、 Eclipse新建项目

我使用maven构建protobuf项目,方便引入protobuf-java-2.5.0.jar依赖。 在项目根目录创建proto文件夹,存放proto文件。 maven依赖pom.xml

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

四、编写.proto文件

在proto文件夹下编写person-entity.proto,如下(proto协议的规则点这查看)

option java_outer_classname = "PersonEntity";//生成的数据访问类的类名
message Person {
required int32 id = 1;//同上
required string name = 2;//必须字段,在后面的使用中必须为该段设置值
optional string email = 3;//可选字段,在后面的使用中可以自由决定是否为该字段设置值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四、使用protoc.exe编译成java类

有两种方法: 1.  使用Java Rumtime执行cmd命令 2.  直接打开cmd运行命令也行。


1.  使用Java Rumtime执行cmd命令

util包下新建GenerareClass类

/**
* protoc.exe
* @author ganhaibin
*
*/
public class GenerateClass {
public static void main(String[] args) {
String protoFile = "person-entity.proto";//
String strCmd = "d:/dev/protobuf-master/src/protoc.exe -I=./proto --java_out=./src/main/java ./proto/"+ protoFile;
try {
Runtime.getRuntime().exec(strCmd);
} catch (IOException e) {
e.printStackTrace();
}//通过执行cmd命令调用protoc.exe程序
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

命令格式如下。

protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件
  • 1

2. 直接打开cmd运行命令

生成的PersonEntity.java类


五、测试

编写Test类,模拟序列化和反序列化过程。

public class Test {
public static void main(String[] args) throws IOException {
//模拟将对象转成byte[],方便传输
PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
builder.setId(1);
builder.setName("ant");
builder.setEmail("ghb@soecode.com");
PersonEntity.Person person = builder.build();
System.out.println("before :"+ person.toString()); System.out.println("===========Person Byte==========");
for(byte b : person.toByteArray()){
System.out.print(b);
}
System.out.println();
System.out.println(person.toByteString());
System.out.println("================================"); //模拟接收Byte[],反序列化成Person类
byte[] byteArray =person.toByteArray();
Person p2 = Person.parseFrom(byteArray);
System.out.println("after :" +p2.toString());
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出如下


后记

我想,拿protobuf协议储存数据,或者作为聊天文本的传输协议,那效率肯定让人咋舌。嘿嘿。

Protobuf协议的Java应用例子的更多相关文章

  1. Protobuf协议--java实现

    Protobuf协议,全称:Protocol Buffer 它跟JSON,XML一样,是一个规定好的数据传播格式.不过,它的序列化和反序列化的效率太变态了…… 来看看几张图你就知道它有多变态.  pr ...

  2. Cocos2d-JS/Ajax用Protobuf与NodeJS/Java通信

    原文地址:http://www.iclojure.com/blog/articles/2016/04/29/cocos2d-js-ajax-protobuf-nodejs-java Google的Pr ...

  3. Protobuf 协议语言指南

    l  定义一个消息(message)类型 l  标量值类型 l  Optional 的字段及默认值 l  枚举 l  使用其他消息类型 l  嵌套类型 l  更新一个消息类型 l  扩展 l  包(p ...

  4. protobuf 协议浅析

    目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...

  5. 自定义兼容多种Protobuf协议的编解码器

    <从零开始搭建游戏服务器>自定义兼容多种Protobuf协议的编解码器 直接在protobuf序列化数据的前面,加上一个自定义的协议头,协议头里包含序列数据的长度和对应的数据类型,在数据解 ...

  6. 开源项目SMSS开源项目(三)——protobuf协议设计

    本文的第一部分将介绍protobuf使用基础以及如何利用protobuf设计通信协议.第二部分会给出smss项目的协议设计规范和源码讲解. 一.Protobuf使用基础 什么是protobuf pro ...

  7. netty系列之:在netty中使用protobuf协议

    目录 简介 定义protobuf 定义handler 设置ChannelPipeline 构建client和server端并运行 总结 简介 netty中有很多适配不同协议的编码工具,对于流行的goo ...

  8. python爬虫之protobuf协议介绍

    前言 在你学习爬虫的知识过程中是否遇到下面的类型.如果有兴趣学习一下或者了解相关知识的,且不嫌在下才疏学浅,可以参考一下.欢迎各位网友的指正. 首先叙述一下问题的会出现的式样. 你可能会在请求参数中看 ...

  9. Google的Protobuf协议分析

    protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文出现的PB代表protobuf). Github:https://github.com/google/protobuf 上图 ...

随机推荐

  1. LeetCode8. 字符串转整数 (atoi)

    8. 字符串转整数 (atoi) 描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连 ...

  2. 洛谷 P4568 [JLOI2011]飞行路线

    题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...

  3. git 如何删除远程提交方法总结

    今天不小心把代码提到主分支了,虽然改动只有一点点,但感觉asdasdasdsadd(要被骂死) 怎么样才能删除掉远程的分支呢. 假设我们有提交 commit commit commit 手残把3提交错 ...

  4. POJ - 1456 贪心 堆常用操作 注意细节

    题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...

  5. Phyton Flask框架学习记录。

    注意:在左侧菜单栏(在JQuery插件库下载的)右边是采用<iframe> 标签嵌入其他页面,此时标签的src应用用后台中的方法名称(本人测试用的是无参数的方法), 而页面跳转window ...

  6. Linux Jenkins

    部署与运行: Jenkins 依赖于 Tomcat 才能跑起来,把 Jenkins 的 jenkins.war 文件放到 Tomcat 的安装目录的 webapps 目录下,配置好端口,正常访问 lo ...

  7. .sort(function(a,b){return a-b});

    var points = [40,100,1,5,25,10]; var b= points.sort(function(a,b){return a-b}); console.log(b); 那个fu ...

  8. Django自定义登陆验证后台

    支持邮箱/手机号/昵称登录,在django1.6.2测试成功.1.models # -*- encoding: utf-8 -*- from django.db import models from ...

  9. 一键压测工具改造(locust)

    本文内容来自“天外归云”大神,原文链接http://www.cnblogs.com/LanTianYou/p/5987741.html,目前只对启动脚本做了一些改造,应该说是,不适用powershel ...

  10. springboot 之 使用jetty web容器

    springboot 中默认的web容器是tomcat. 在maven 的pom 文件中加入如下依赖,便可使用tomcat 容器. <dependency> <groupId> ...