2012-03-20 65 views
1

我正在嘗試在Google協議緩衝區中使用擴展名。我有一個「主要」原始文件和其他幾個「擴展」主要文件的原始文件。在Protobuf中寫入和讀取重複的擴展字段

在我的java代碼中,我不是100%確定如何正確添加到重複消息。當我運行我編寫的java代碼時,toString()方法顯示添加了擴展屬性,但它不能正確解碼(可能是因爲我對添加的Collar對象運行了build()調用)。

我應該如何正確地向原型文件中的擴展項添加重複元素?

File1.proto

package protocol_buffer; 
option java_outer_classname = "PetClass"; 

message Pet { 
    optional string pet_name = 1; 
    extensions 100 to 199; 
} 

File2.proto

import "File1.proto";  

option java_outer_classname = "CollarClass"; 

message Collars { 
    optional string collar_type = 1; 
    optional string collar_color = 2; 
} 

extend pet { 
    repeated Collars collar = 100; 
} 

MyFile.java

Pet pet = Pet.newBuilder() 
.setPetName("Fido") 
.addExtension(CollarClass.collar, 
    Collar.newBuilder() 
    .setCollarType("round") 
    .setCollarColor("brown") 
    .build() 
    ) 
.build(); 

System.out.println(pet.toString()); 

回答

2

我想通了,我的問題。我正確地將擴展名添加到「寵物」。在解析protobuf字節數組時,您需要添加一個擴展註冊表,以便該函數知道要解析的擴展名。

ExtensionRegistry registry = ExtensionRegistry.newInstance(); 
registry.add(CollarClass.collar); 

Pet pet = Pet.parseFrom(new FileInputStream(<some file>),registry);