2012-03-20 62 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);