2014-03-07 46 views
5

我試圖減少Google proto-buf生成的方法數量,其中一種選擇是使用proto-buf nano。但是我沒有發現如何使用它的文檔。除package link外,我無法找到關於如何使用nano從proto文件生成java文件的任何信息。Android protobuf nano文檔

所以這個問題很簡單:如何使用谷歌proto nano從proto文件生成java類以及如何在項目中使用它們?

回答

8

縱觀主要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); 
} 

看着protobuf's Readme

納米發電機選項

  • java_package -> <file-name>|<package-name>
  • java_outer_classname -> <file-name>|<package-name>
  • java_multiple_files -> true or false
  • java_nano_generate_has -> true or false [DEPRECATED]
  • optional_field_style -> default or accessors
  • enum_style -> c or java

要使用的納米protobufs的Android回購以外:

  • 鏈接與生成的罐子--javanano_out文件<protobuf-root>java/target/protobuf-java-2.3.0-nano.jar.
  • 調用,如:

./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回購中納米protobufs:

  • 設置'LOCAL_PROTOC_OPTIMIZE_TYPE := nano'在您的本地.mk文件中。在構建Java庫或應用程序(包)目標時,系統會將Java nano運行時庫添加到變量中,因此您不需要。
  • 在您的本地.mk文件中爲您需要的任何命令行選項設置'LOCAL_PROTO_JAVA_OUTPUT_PARAMS := ...'。使用逗號加入多個
    選項。僅在納米風味中,名稱和值周圍的空白字符將被忽略,因此您可以使用反斜槓新行或
    '+ ='來很好地構建您的製作文件。
  • 當您構建Java庫或包時,這些選項將應用於全部LOCAL_SRC_FILES中的原始文件。如果不同選項需要
    不同的原始文件,建立單獨的Java庫
    並在您的主要目標中引用它們。注意:您應該確保
    對於每個單獨的目標,從LOCAL_SRC_FILES中的任何
    原始文件導入的所有原始文件都包含在LOCAL_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]; 
} 

命令行

./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 

測試從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); 
    } 
提取

有很多的測試用例在同一個班級,並期待在項目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> 

希望這有助於。

+0

非常感謝回答...會給它一個稍後再試,並取回 – gunar

+0

不客氣。 – vzamanillo

+0

我試圖按照您的建議行事,我被卡住了。你可以請看看[這個問題](http://stackoverflow.com/q/22712937/1051783)? – gunar