写在前面
在学习使用 protocol buffers 的时候一开始在网上找一些博客看,遇到的问题是很多博客写的并不清晰看了也是让人一头雾水,没法达到对 protocol buffers 快速上手使用的目的(完成一个 hello world)。然后通过官方文档学习后对 protocol buffers 有了大概的认识,也达到能够应用的程度。建议最好还是去看官网上的文档,描述的很详细。protocol buffers 官网(请科学上网)。
Protocol Buffers 是什么?
Protocol Buffers 简称 protobuf , 由 google 开源。是一中语言中立 , 平台中立 ,(不和特定的语言、操作系统绑定),对结构化数据进行序列化、反序列化的机制。类似于 XML , 比起 XML protobuf 的优点是 :数据占用空间小 , 传输速度快 ,使用起来简单 , 定义一次数据结构,生成指定语言的代码 (目前支持Java 、Python 、C++ 、Objective-C 、Go 、Ruby 、C# 、JavaScript 、PHP 、Dart )。 缺点是可读性不如 XML 。protobuf 不是好的面向对象的设计 , 不能发挥面向对象的特性 , 不应该通过继承向生成的类添加行为, 这会打破内部机制,无论如何都不是很好的面向对象的实践。
开始使用 brotobuf
1. 下载并安装 protobuf compiler (用 C++ 编写),作用是根据定义的 .proto 文件生成指定语言的代码。
这一步有两种方式 :
1. 使用源码自己去编译、安装 (对使用 C++ 的同学来说很简单)。
2. 下载已经编译好的可以直接执行的二进制文件 (对使用非 C++ 的同学来说很方便 ,下载后最好配置到环境变量中)。
2. 根据所使用的语言下载 protobuf 对应的运行时包 , 比如我使用的是 java 语言 , 那么我需要将 protobuf-java (maven 中可以找到) 这个包添加到我的工程内。
第 1 步是和开发环境有关 , 使用 protobuf compiler 生成代码 ,将生成的代码放在自己的应用中。
第 2 步是和运行时有关 , 要在自己的应用中添加 protobuf 对应语言的包。
3. 编写 .proto 文件 ,在 .proto 文件中定义数据结构 , .proto 有定义好的语法规则 。 (我使用的 IDE 是 IDEA , 在 IDEA 中安装了 Protobuf Support 插件 , 可以提供一些诸如语法检查的帮助)。
4. 根据指定的 .proto 文件生成代码 , 这里我生成的是 Java 代码 , 例子 :
cat.proto 文件内容
syntax = "proto2"; package tutorial; option java_package = "net.j4love.protobuf.demo"; option java_outer_classname = "CatProto"; message Cat { required int32 id = 1; required string name = 2; required string color = 3; }
protoPath : .proto 文件所在路径;
codeDestPath : 生成的 java 代码目标路径
protoFilePath : 具体的某个 .proto 文件所在路径
protobuf compiler 命令生成代码 : protoc -I=$protoPath --java_out=$codeDestPath $protoFilePath (protoFilePath 可以同时指定多个,之间用空格隔开)
例子 :
protoc -I=E:/Develop/hepeng/protobuf-demo/src/main/java/net/j4love/protobuf/proto --java_out=E:/Develop/hepeng/protobuf-demo/src/main/java E:/Develop/hepeng/protobuf-demo/src/main/java/net/j4love/protobuf/proto/cat.proto
使用 Java 代码的生成方式例子 :
// protobufCompilerPath 是安装的 protobuf compiler 中 protoc.exe 的绝对路径 // 例如 :D:/DevelopmentTools/protobuf compiler/bin/protoc.exe public static void generateJavaCode(String protobufCompilerPath , String protoPath , String codeDestPath , String ... protoFilePaths) { String protobufCmd = protobufCompilerPath + " -I=" + protoPath + " --java_out=" + codeDestPath + " "; for (String protoFilePath : protoFilePaths) { protobufCmd += " " + protoFilePath; } System.out.println("protobuf Generate Code Command : " + protobufCmd); try { Runtime.getRuntime().exec(protobufCmd); } catch (IOException e) { e.printStackTrace(); } }
经过这 4 步就可以完成一个 protobuf 的 hello world 了 , 其他详细内容还是建议看官方的文档。我编写的 protobuf-demo 代码地址。