Protocol buffers 快速入门(针对 Java 语言)

写在前面

        在学习使用 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 代码地址

猜你喜欢

转载自my.oschina.net/j4love/blog/1811486