我正在尝试使用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版本:
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/