Protobuf踩坑笔记

1. 安装和解析

  1. 下载bin版本的pb:https://github.com/protocolbuffers/protobuf/releases
  2. 设置环境变量,并查看protoc是否有效和安装的版本:

    In [65]: import google.protobuf as pb
    In [66]: pb.__version__
    Out[66]: '3.6.1'
    
  3. 生成解析类:https://developers.google.com/protocol-buffers/docs/reference/java-generated?hl=zh-CN

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/to/file.proto

实例:(注意:会按照.proto文件中定义的java_package,自动recursive生成目录。)

protoc --proto_path=src/main/resources/ --java_out=src/main/scala/ src/main/resources/nn_order_sample.proto
protoc --proto_path=src/main/resources/ --python_out=src/main/resources/ src/main/resources/nn_order_sample.proto

2. API使用

  1. 官网教程中有些api不可用,比如python api中的:

    而应该是:address_book.FromString(f.read())。官方教材中java api应该是没问题的(newBuilder()建立对象,静态方法parseFrom直接解析对象)。

  2. 参考各语言api编写程序:https://developers.google.com/protocol-buffers/docs/reference/java-generated?hl=zh-CN

3. 前后兼容的字段扩展

  1. 通过optional扩展字段(而非required):注意字段的field number不能和原来的相同,也不能改变原来的字段的field number。
  2. 还可以通过importextend的方式扩展字段(没有具体探索)。
import "myproject/other_protos.proto";
extend Foo {
  optional int32 bar = 126;
}

message Baz {
  extend Foo {
    optional Baz foo_ext = 127;
  }
  ...
}

4. 其他

  1. 关于oneof关键字:
    • Setting a oneof field will automatically clear all other members of the oneof. So if you set several oneof fields, only the last field you set will still have a value.
    • Extensions are not supported for oneof.
    • A oneof cannot be repeated.
    • Reflection APIs work for oneof fields.

发表评论

电子邮件地址不会被公开。 必填项已用*标注