Window下Protobuf Java使用教程

﹏ヽ暗。殇╰゛Y 2022-05-25 05:37 315阅读 0赞
  1. Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、JavaPython 三种语言的 API

一、环境搭建

Google提供了ProtoBuf编译器,可以将配置文件,编译生成代码类。

去Github下载源码:https://github.com/google/protobuf

由于是Window环境,需要下载编译器protoc-3.5.1-win32.zip

将从Github下载的源码protobuf-master.zip解压,我放到了D:\tools\protobuf\protobuf-master目录

然后protoc-3.5.1-win32.zip解压,将bin目录下面的protoc.exe放到D:\tools\protobuf\protobuf-master目录下面的src目录。

此时protoc.exe路径为D:\tools\protobuf\protobuf-master\src\protoc.exe

二、新建Intelidea Java项目

新建Intelidea Java项目,在build.gradle添加依赖,由于使用的protoc.exe是3.5.1版本,protobuf-java使用3.5.1版本。

  1. // https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
  2. compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.5.1'

三、新建test.proto文件

如何编写.proto文件,请参看这篇文章:Protocol Buffers序列化协议及应用

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

#

将生成的test.proto文件,放到工程的目录下面

20180508224222754

四、编译生成java类

使用Runtime运行命令,来生成java代码。

命令格式如下:protoc.exe -I=proto的输入目录 —java_out=java类输出目录 proto的输入目录包括包括proto文件

  1. import java.io.IOException;
  2. /**
  3. * Created by wzj on 2018/5/8.
  4. */
  5. public class ExecProtobuf
  6. {
  7. public static void main(String[] args) throws IOException
  8. {
  9. String strCmd = "D:\\tools\\protobuf\\protobuf-master\\src\\protoc.exe " +
  10. " -I=H:\\JAVA\\protobuf " +
  11. " --java_out=./src/main/java " +
  12. " H:\\JAVA\\protobuf\\test.proto";
  13. Runtime.getRuntime().exec(strCmd);
  14. }
  15. }

执行上面代码会发现,在java目录下面生成了PersonEntity.java类

五、测试

新建ProtobufTest.java类

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

执行之后,输出如下:

20180508225045784

参考教程:

https://worktile.com/tech/share/prototol-buffers

发表评论

表情:
评论列表 (有 0 条评论,315人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang使用protobuf简易教程

    golang使用protobuf简易教程 google公司发布的一套开源编码规则,基于二进制流的序列化传输,可以转换成多种编程语言,几乎涵盖了市面上所有的主流编程语言,当