我正在尝试使用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版本:
  • here下载了protobuf-2.5.0.zip和编译器protoc-2.5.0-win32.zip
  • protobuf-2.5.0.zip解压缩到一个文件夹,然后在src子文件夹中将protoc.exe解压缩。
  • 更改为java文件夹,并在其中发布:mvn clean package -P nano。该命令运行正常,在target文件夹中,我有protobuf-java-2.5.0.jar

  • 从这里我不确定如何继续,因为在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

    问题是:我在上面缺少什么/做错了什么?我正在尝试从上述原始文件生成Java文件。

    最佳答案

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

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

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

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

    更新:

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

    用于一个原型(prototype)文件

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

    用于多个原型(prototype)文件
    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。解析原型(prototype)后,调用者可以在使用值之前检查该值是否为null。 Null表示未设置该值。

    上面的调用脚本可以变成:
    protoc --javanano_out=store_unknown_fields=true,optional_field_style=reftypes:target/generated-sources --proto_path=input input/*.proto
    

    关于java - Android protobuf nano使用情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22712937/

    10-10 05:13