Android protobuf纳米用法

gun*_*nar 6 java android protocol-buffers maven

我正在尝试使用protobuf nano从proto文件下面生成java文件.我得到了一些关于如何继续这个SO线程的基本指令.

我有这个原型文件,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;
}
Run Code Online (Sandbox Code Playgroud)

我试着按照这里的说明,更具体地说是NANO版本:

  1. 这里下载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

从这里我不知道如何继续,因为在初始文档中我有这样的声明:

- Link with the generated jar file
  <protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
Run Code Online (Sandbox Code Playgroud)

我不确定这意味着什么,如何链接?是否有一些参数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文件.

vza*_*llo 7

我认为这protoc不是通过javanano支持编译的.

预编译的windows版本2.5.0不包括nano支持,看看源代码,在" src\google\protobuf\compiler"路径中,包括java生成器,但不包括javanano生成器.谷歌存储库的最新源代码包括javanano.

您可以下载最新的源代码并尝试使用MinGW和msys或CygWin编译它,看一下这篇文章如何在Windows中构建谷歌协议缓冲区用于mingw?

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

更新:

构建后的最终命令行 protoc.exe

对于一个原型文件

protoc --javanano_out=store_unknown_fields=true:target/generated-sources personal.proto, target/generated-sources
Run Code Online (Sandbox Code Playgroud)

对于多个原型文件

protoc --javanano_out=store_unknown_fields=true:target/generated-sources --proto_path=inputpath input/*.proto
Run Code Online (Sandbox Code Playgroud)

编辑 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
Run Code Online (Sandbox Code Playgroud)