Java中的协议缓冲区`ParseFromString`用于解析文本格式?
ParseFromString
在Java中是否可用于协议缓冲区?
C ++版本有它: 这里
这是ParseFromString的实现 (请注意, TextFormat::ParseFromString
只是在新的Parser
对象上调用TextFormat::Parser::ParseFromString
):
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); }
对于消息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
用proto3
测试。