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

Tia*_* Li 9 java parsing protocol-buffers

是否ParseFromString可以在Java中的协议缓冲区?

C++版本有它:在这里

P M*_*cki 5

对于消息A,方法TextFormat.getParser().merge(str, builder);可以做到.例如:

    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
Run Code Online (Sandbox Code Playgroud)

经过测试proto3.


use*_*751 2

这是 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);
}
Run Code Online (Sandbox Code Playgroud)

您可以看到,它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);
}
Run Code Online (Sandbox Code Playgroud)