java protobuf 例子_Protobuf协议的Java应用例子

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

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

42acbce4a14ff782388b62944a09e296.png

c3cd49f87d9ae984852f7d971555fe64.png

819242d009beffaee43d48eef93b5c28.png

Protobuf的Java实例

一、 安装Protobuf

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

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

二、 配置环境变量

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

313732097f219ac97a43ba65c3c25e96.png

三、 Eclipse新建项目

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

1f44098ada7a32926a53f3cff6712c99.png maven依赖pom.xml

com.google.protobuf

protobuf-java

2.5.0

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类

c98f18f04e386d9486da5bbeed8265c2.png

/**

* 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运行命令

f20f509560587720a94b0bd605b4b74f.png

生成的PersonEntity.java类

91ada6a7f5c030847066a28b7432f02d.png

五、测试

编写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

输出如下

b75e639f6e97eb9f51205900e6d0425a.png

后记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值