gpt4 book ai didi

java - Android protobuf nano 用法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:50:46 31 4
gpt4 key购买 nike

我正在尝试使用 protobuf nano 从下面的 proto 文件生成 java 文件。我在 this SO thread 中获得了一些关于如何进行的基本说明。 .

我有这个原型(prototype)文件,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

从这里我不确定如何继续,因为在 initial documentation我有这个声明:

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

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

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

但我收到此错误:--javanano_out: protoc-gen-javanano: 系统找不到指定的文件

问题是:我在上面遗漏了什么/做错了什么?我正在尝试从上述原型(prototype)文件生成 java 文件。

最佳答案

我认为这个protoc 编译时没有javaano 支持。

预编译的windows 2.5.0版本不包含nano支持,看看源码,在“src\google\protobuf\compiler”路径下,包含了java生成器但不是 javanano 生成器。最新source code在 google 存储库中包含 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。解析 proto 时,调用者可以在使用该值之前检查该值是否为 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com