在和远端交互数据时,特别是通信双方使用的编程语言不一样,如服务端使用Java而客户端使用C++等其它编程语言。这就会导致数据流不兼容,出现你不懂我我不懂你的局面,这时候谷歌的谷歌开源项目ProtoBuf就可以解决这个问题,除此之外,用它编写的协议对老版本协议进行兼容。在这里给出自己实践的过程和结果。
实践环境
- Win7操作系统
- 编程语言Java
- 编程软件为IDEA
第一步:编写.proto文件
这一步不需要过多说了,请参照官方指导1中Defining Your Protocol Forma部分。讲一下注意的点:
option java_package = "com.testnetdeve.custom.proto"; option java_outer_classname = "AlarmProto";
如上代码是自己写的包名和类名参数
图中所示是.proto源文件以及编译后的java文件
解释
option java_package = “com.testnetdeve.custom.proto
”, 这一句是编编译.proto文件后输出得到的java文件的包名option java_outer_classname = “AlarmProto
”,这一句是编编译.proto文件后输出得到的java文件的名字,即类名
注意
1.文件的包名最后和你的proto文件所在的项目的文件夹的位置统一,即你想编译后的java文件在哪个地方,你就把java_package
的属性设为此。如我想把输出的java文件放在com->testnetdeve->custom->proto
,我就把属性定位com.testnetdeve.custom.proto
,此时生成对应的java文件的包名如图所示。
2.java_outer_classname
的参数不能和.proto文件中结构体名一致,否则会报错。
第二步:编译.proto文件
下载.proto文件的编译器,传送门在此。我的操作系统是64bit的,所以下载的是protoc-3.7.1-win64.zip
文件如图所示。
4.解压protoc-3.7.1-win64.zip
文件后安装即配置全局环境变量。
5.验证是否安装成功
输入命令protoc --version
,出现版本号即为成功,如图所示。
第三步:编译在第一步中的.proto文件
在命令行中输入如下代码:
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
其中SRC_DIR
是源文件夹,DST_DIR
是目的文件夹,因为我的Java项目文件夹层次太深,不好写命令。所以我就把.proto文件复制到D:\Java
文件夹中,然后运行如下命令:
protoc -I=D:\Java --java_out=D:\Java D:\Java\alarm.proto
在D:\Java文件夹中就会生成以com文件夹为根文件夹的层次结构,就是第一步中java_package
的属性值的文件结构。在最后一层的proto文件夹中,你会发现被编译后生成的AlarmProto.java文件。
第四步:导入ProtoBuf项目的jar包
下载地址在此,请点击,在你的项目中导入该jar包。当然也可以进行Maven直接导入。
第五步:测试生成的Java文件
测试代码为:
package com.testnetdeve.UnitTest; import com.testnetdeve.custom.proto.AlarmProto; import org.junit.Test; public class AlarmProtoTest { @Test public void protoTest(){ AlarmProto.Alarm.Builder alarm = AlarmProto.Alarm.newBuilder(); alarm.setCommunity("世纪佳缘"); alarm.setBuildingId(31); alarm.setCellId(1); alarm.setRoomId(204); alarm.setAttachment("此时的时间"); System.out.println(alarm.toString()); } }
结果为:
community: "\344\270\226\347\272\252\344\275\263\347\274\230" building_id: 31 cell_id: 1 room_id: 204 attachment: "\346\255\244\346\227\266\347\232\204\346\227\266\351\227\264"
至此,你就会使用谷歌开源项目ProtoBuf了。
参考文献
https://developers.google.com/protocol-buffers/docs/javatutorial ↩︎