简单介绍Protobuf协议

架构师-网络文章汇总
Protobuf协议 , 全称:Protocol Buffer它跟JSON , XML一样 , 是一个规定好的数据传播格式 。 不过 , 它的序列化和反序列化的效率太变态了……
来看看几张图你就知道它有多变态 。
简单介绍Protobuf协议文章插图
简单介绍Protobuf协议文章插图
简单介绍Protobuf协议文章插图
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的存放目录 。
简单介绍Protobuf协议文章插图
三、 Eclipse新建项目我使用maven构建protobuf项目 , 方便引入protobuf-java-2.5.0.jar依赖 。 在项目根目录创建proto文件夹 , 存放proto文件 。
简单介绍Protobuf协议文章插图
maven依赖pom.xml
com.google.protobufprotobuf-java2.5.012345四、编写.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;//可选字段 , 在后面的使用中可以自由决定是否为该字段设置值}123456四、使用protoc.exe编译成java类有两种方法:1. 使用Java Rumtime执行cmd命令2. 直接打开cmd运行命令也行 。
1. 使用Java Rumtime执行cmd命令util包下新建GenerareClass类
简单介绍Protobuf协议文章插图
/** * 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程序}}12345678910111213141516命令格式如下 。
protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件12. 直接打开cmd运行命令
简单介绍Protobuf协议文章插图
生成的PersonEntity.java类
简单介绍Protobuf协议文章插图
五、测试编写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());}}123456789101112131415161718192021222324