gun*_*nar 5 java android protocol-buffers
我正在尝试减少Google proto-buf生成的方法数量,其中一种方法是使用proto-buf nano.但是我没有找到关于如何使用它的文档.除了包链接,我找不到任何关于如何使用nano从proto文件生成java文件.
所以问题很简单:如何使用google proto nano从原型文件生成java类以及如何在项目中使用它们?
查看主要的protobuf编译器源代码:
#include <google/protobuf/compiler/javanano/javanano_generator.h>
....
int main(int argc, char* argv[]) {
google::protobuf::compiler::CommandLineInterface cli;
cli.AllowPlugins("protoc-");
...
// Proto2 JavaNano
google::protobuf::compiler::javanano::JavaNanoGenerator javanano_generator;
cli.RegisterGenerator("--javanano_out", &javanano_generator,
"Generate Java source file nano runtime.");
return cli.Run(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)
Nano Generator选项
java_package -> <file-name>|<package-name>java_outer_classname -> <file-name>|<package-name>java_multiple_files -> true or falsejava_nano_generate_has -> true or false [DEPRECATED]optional_field_style -> default or accessorsenum_style -> c or java
要在Android repo之外使用nano protobufs:
- 链接生成的jar文件
<protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.- 调用
--javanano_out,例如:
./protoc '--javanano_out=java_package=src/proto/simple-data.proto|my_package,java_outer_classname=src/proto/simple-data.proto|OuterName:.' src/proto/simple-data.proto
要在Android repo中使用nano protobufs:
LOCAL_PROTOC_OPTIMIZE_TYPE := nano在本地.mk文件中设置' '.在构建Java库或app(包)目标时,构建
系统会将Java nano运行时库添加到
LOCAL_STATIC_JAVA_LIBRARIES变量中,因此您不需要.LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ...在本地.mk文件中设置' ',以获取所需的任何命令行选项.使用逗号连接多个
选项.仅在nano flavor中,
忽略了选项名称和值周围的空白,因此您可以使用反斜杠换行符或
'+ ='来很好地构建make文件.- 在 构建Java库或包时,这些选项将应用于所有 proto文件
LOCAL_SRC_FILES.如果不同的
proto文件需要不同的选项,请构建单独的Java库
并在主目标中引用它们.注意:您应确保
对于每个单独的目标,包含从任何
原型文件导入的所有原型文件.这 是因为生成器必须假定导入的文件是 使用相同的选项构建的,并且将生成 使用相同代码 样式引用导入文件中的字段和枚举的代码.LOCAL_SRC_FILESLOCAL_SRC_FILES- 提示:'
include $(CLEAR_VARS)'重置所有LOCAL_变量,包括上面的两个变量.
来自https://android.googlesource.com/platform/external/protobuf/+/master/src/google/protobuf/的简单纳米示例.
unittest_simple_nano.proto
package protobuf_unittest_import;
option java_package = "com.google.protobuf.nano";
// Explicit outer classname to suppress legacy info.
option java_outer_classname = "UnittestSimpleNano";
message SimpleMessageNano {
message NestedMessage {
optional int32 bb = 1;
}
enum NestedEnum {
FOO = 1;
BAR = 2;
BAZ = 3;
}
optional int32 d = 1 [default = 123];
optional NestedMessage nested_msg = 2;
optional NestedEnum default_nested_enum = 3 [default = BAZ];
}
Run Code Online (Sandbox Code Playgroud)
命令行
./protoc '--javanano_out=java_package=google/protobuf/unittest_simple_nano.proto|com.google.protobuf.nano,java_outer_classname=google/protobuf/unittest_simple_nano.proto|UnittestSimpleNano:target/generated-test-sources' google/protobuf/unittest_simple_nano.proto
Run Code Online (Sandbox Code Playgroud)
测试从NanoTest.java中提取
public void testSimpleMessageNano() throws Exception {
SimpleMessageNano msg = new SimpleMessageNano();
assertEquals(123, msg.d);
assertEquals(null, msg.nestedMsg);
assertEquals(SimpleMessageNano.BAZ, msg.defaultNestedEnum);
msg.d = 456;
assertEquals(456, msg.d);
SimpleMessageNano.NestedMessage nestedMsg = new SimpleMessageNano.NestedMessage();
nestedMsg.bb = 2;
assertEquals(2, nestedMsg.bb);
msg.nestedMsg = nestedMsg;
assertEquals(2, msg.nestedMsg.bb);
msg.defaultNestedEnum = SimpleMessageNano.BAR;
assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
byte [] result = MessageNano.toByteArray(msg);
int msgSerializedSize = msg.getSerializedSize();
//System.out.printf("mss=%d result.length=%d\n", msgSerializedSize, result.length);
assertTrue(msgSerializedSize == 9);
assertEquals(result.length, msgSerializedSize);
SimpleMessageNano newMsg = SimpleMessageNano.parseFrom(result);
assertEquals(456, newMsg.d);
assertEquals(2, msg.nestedMsg.bb);
assertEquals(SimpleMessageNano.BAR, msg.defaultNestedEnum);
}
Run Code Online (Sandbox Code Playgroud)
同一个类中有很多测试用例,查看项目pom,你可以找到一个maven-antrun-plugin配置来生成测试资源类
<!-- java nano -->
<exec executable="../src/protoc">
<arg value="--javanano_out=java_package=google/protobuf/unittest_import_nano.proto|com.google.protobuf.nano,java_outer_classname=google/protobuf/unittest_import_nano.proto|UnittestImportNano:target/generated-test-sources" />
<arg value="--proto_path=../src" />
<arg value="--proto_path=src/test/java" />
<arg value="../src/google/protobuf/unittest_nano.proto" />
<arg value="../src/google/protobuf/unittest_simple_nano.proto" />
<arg value="../src/google/protobuf/unittest_stringutf8_nano.proto" />
<arg value="../src/google/protobuf/unittest_recursive_nano.proto" />
<arg value="../src/google/protobuf/unittest_import_nano.proto" />
<arg value="../src/google/protobuf/unittest_enum_multiplejava_nano.proto" />
<arg value="../src/google/protobuf/unittest_multiple_nano.proto" />
</exec>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
7351 次 |
| 最近记录: |