Android protobuf纳米用法
我正在尝试使用protobuf nano从proto文件下面生成java文件。 我得到了一些关于如何继续这个SO线程的基本指令。
我有这个proto文件, 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; }
我试着按照这里的说明,更具体地说是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
从这里我不知道如何继续,因为在最初的文档中我有这样的声明:
- Link with the generated jar file 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
: --javanano_out: protoc-gen-javanano: The system cannot find the file specified
。
问题是:上面我错过了什么/做错了什么? 我试图从proto文件上面生成java文件。
我认为这个javanano
不是用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
对于多个原型文件
protoc --javanano_out=store_unknown_fields=true:target/generated-sources --proto_path=inputpath input/*.proto
EDIT Nano生成器使用public static final int
字段替换enum成员。 如果类具有可选的枚举成员,则会出现问题,因为该成员将被编译为原始int
值,并且将采用默认值零,这将是枚举中的第一个元素。 为了区分未设置枚举值的情况,可以利用optional_field_style
生成java.lang.Integer
而不是原始int的optional_field_style
参数。 解析proto时,调用者可以在使用该值之前检查该值是否为null。 Null表示未设置值。
上面的调用脚本可以变成:
protoc --javanano_out=store_unknown_fields=true,optional_field_style=reftypes:target/generated-sources --proto_path=input input/*.proto
- AsycTask抛出IllegalStateException – 片段未附加到活动
- zxing ean13条形码编码带’lead’,’separator’和’trailer’
- FCM:没有调用onMessageReceived,即使将msg发送到fcm后也没有通知?
- 双击:放大Android MapView?
- 使用Joda-Time Library将字符串转换为Google Tasks API中的DateTime格式
- 如何解析Sub JSONArray并显示图像?
- EditText on demand小部件
- Android Javamail自定义身份validation
- commandinfokationfailure,有谁知道如何修复这个bug?