Protobuf协议的Java应用例子

匿名 (未验证) 提交于 2019-12-02 21:53:52

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



Protobuf的Java实例

一、 安装Protobuf

去Protobuf的GitHub下载,解压。

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

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

二、 配置环境变量


三、 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>3.1.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类



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将对象转为byte数组进行传输,反序列化时讲byte数组转为对象

protobuf效率高的原因很简单,只传输对方需要的数据; Json垃圾的原因是,Json每次都要把整个键值对传输,包括名字、逗号都要传输一遍,对方都知道这些东西还传来传去,不是浪费是什么,要传就传对方没有的数据。 只需要传键值就可以了,但是Json只传键值就乱套了,收到以后不知道数据格式,没法解析。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!