使用com.google.protobuf.Descriptors.Descriptor创建新构建器

时间:2017-04-28 08:41:23

标签: java protocol-buffers

我需要为给定的com.google.protobuf.Descriptors.Descriptor创建一个类的newBuilder()。

我使用google proto buffer为以下协议创建了一个jar:

message Foo
{
  optional uint32 id = 1;
  optional string fooName = 2;
}
message Bar
{
  optional uint32 id = 1;
  optional string barName = 2;
}

从Java方面来看,基于Descriptor我需要创建newBuilder()。 例如:

    Message.Builder message;
    if(Descriptor.getName().equals("Foo"))
        message = Foo.newBuilder();
    if(Descriptor.getName().equals("Bar"))
        message = Bar.newBuilder();

但是,如果不是或者转换案例,我也不想去。 此外,我还尝试了使用DynamicMessage的其他方法。

Message.Builder message = DynamicMessage.newBuilder(descriptor);

但在这种情况下,我无法将其转换为 Foo Bar 类。有没有其他方法可以使用Descriptor或Descriptor名称创建newBuilder()?

盲目地我需要给定类名的newBuilder():

Message.Builder message = SomeUtilClass.getNewBuilder("Foo");

1 个答案:

答案 0 :(得分:1)

您无法从Builder创建DescriptorDescriptor没有关于它需要创建的proto(或builder)类的类型信息,因为所有Descriptor个实例属于同一个类(it's final)。

如果您只能使用Descriptor,那么您的if/else大致可以获得。 (我粗略地说,因为你可以用地图或开关代替它;但它基本上是一样的。)

更好的方法是使用您尝试创建的proto的默认实例(或该proto的任何其他实例;但默认实例最难获取)。

Message prototype = Foo.getDefaultInstance();  // Or Bar.getDefaultInstance().

因为从Message你可以得到一个构建器和描述符:

Message.Builder builder = prototype.newBuilderForType();
Descriptor descriptor = prototype.getDescriptorForType();