Android protobuf纳米用法

时间:2014-03-28 12:30:32

标签: java android maven protocol-buffers

我正在尝试使用protobuf nano从proto文件下面生成java文件。我得到了关于如何进行this SO thread的基本指导。

我有这个原型文件personal.proto

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

我尝试按照说明from here,更具体地说是 NANO版

  1. here下载protobuf-2.5.0.zip和编译器protoc-2.5.0-win32.zip
  2. protobuf-2.5.0.zip解压缩到一个文件夹,并在src子文件夹中解压缩protoc.exe
  3. 已更改为java文件夹,并已发布:mvn clean package -P nano。该命令运行正常并且在target文件夹中我有protobuf-java-2.5.0.jar
  4. 从这里开始我不知道如何继续,因为initial documentation我有这样的陈述:

    - Link with the generated jar file
      <protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
    

    我不确定这意味着什么,如何链接?是否有protoc.exe的参数指定要使用的jar文件?

    我尝试发出此命令:protoc --javanano_out=enum_style=java --java_out=generated personal.proto

    但我收到此错误:--javanano_out: protoc-gen-javanano: The system cannot find the file specified

    问题是:上面我错过了什么/做错了什么?我正在尝试从proto文件上面生成java文件。

1 个答案:

答案 0 :(得分:7)

我认为此protoc未使用javanano支持进行编译。

预编译的Windows 2.5.0版不包含nano支持,看看源代码,在“src\google\protobuf\compiler”路径中,包括java生成器,但不包括javanano生成器。谷歌存储库中的最新source code包括javanano。

您可以下载latest source code并尝试使用MinGW和msys或CygWin对其进行编译,请查看此帖How to build google protocol buffers in Windows for mingw?

(稍后我会发布建设过程的详细信息)

<强>更新

构建protoc.exe

后的最终命令行

对于一个原型文件

protoc --javanano_out=store_unknown_fields=true:target/generated-sources personal.proto, target/generated-sources

适用于多个原型文件

protoc --javanano_out=store_unknown_fields=true:target/generated-sources --proto_path=inputpath input/*.proto

编辑 Nano生成器用public static final int字段替换枚举成员。如果类具有可选的枚举成员,则会出现问题,因为该成员将被编译为原始int值,并且将采用默认值零,这将是枚举中的第一个元素。为了区分未设置枚举值的情况,可以利用optional_field_style参数生成java.lang.Integer而不是原始int。解析proto时,调用者可以在使用该值之前检查该值是否为null。 Null表示未设置值。

上述调用脚本可以变为:

protoc --javanano_out=store_unknown_fields=true,optional_field_style=reftypes:target/generated-sources --proto_path=input input/*.proto
相关问题