Java中的协议缓冲区`ParseFromString`用于解析文本格式?

时间:2015-03-06 00:57:18

标签: java parsing protocol-buffers

Java中是否有ParseFromString用于协议缓冲区?

C ++版本有:here

2 个答案:

答案 0 :(得分:5)

对于消息A,方法TextFormat.getParser().merge(str, builder);执行此操作。 E.g:

    AOuterClass.A.Builder buildA = AOuterClass.A.newBuilder();
    buildA.setName("Abra Kadabra");
    buildA.addPrices(3.14);
    buildA.addPrices(3.141592);
    AOuterClass.A aaa = buildA.build();

    String str = aaa.toString();

    AOuterClass.A.Builder builder = AOuterClass.A.newBuilder();
    ///////////////////////////////////////////
    TextFormat.getParser().merge(str, builder);

    System.out.println(builder.build().equals(aaa));  //true

使用proto3进行测试。

答案 1 :(得分:2)

Here is the implementation of ParseFromString(请注意,TextFormat::ParseFromString只是在新的TextFormat::Parser::ParseFromString对象上调用Parser

bool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input,
                               Message* output) {
  output->Clear();
  return Merge(input, output);
}

bool TextFormat::Parser::ParseFromString(const string& input,
                                         Message* output) {
  io::ArrayInputStream input_stream(input.data(), input.size());
  return Parse(&input_stream, output);
}

您可以看到Parse只是清除消息,然后调用Merge。虽然Protocol Buffers的Java实现没有Parse方法,但您可以轻松实现它:

public static void parseFromString(CharSequence input, ExtensionRegistry extensionRegistry, Message.Builder builder) throws ParseException {
    builder.clear();
    TextFormat.merge(input, extensionRegistry, builder);
}