Protobuf解析器解析其他对象?

时间:2018-04-01 21:01:32

标签: java protocol-buffers protobuf-java

我一直在Java中使用协议缓冲区。我发现protobuf对象的解析器,解析其他Protobuf数据并且不会抛出异常。相反,它返回一个解析器类型的对象,没有任何数据(不是默认实例)

以下是我的测试原型文件

option java_package = "tester";
option java_outer_classname = "TestProto";

message A{
    string message = 1;
}

message B{
    int64 id = 1;
}

下面是我的测试代码

 TestProto.A a = TestProto.A.newBuilder().setMessage("My Test Message").build();
 TestProto.B b = TestProto.B.getDefaultInstance().getParserForType().parseFrom(a.toByteString());

 System.out.println("Is default instnace :" + (b.getDefaultInstanceForType() == b));

此代码无异常地运行,结果为' false'。

我无法理解这种行为,我需要一种情况,我必须解析一些序列化的protobuf对象,如果一个解析器失败,我必须尝试其他解析器。我该怎么解决这个问题呢。

感谢。

1 个答案:

答案 0 :(得分:1)

Protobuf预先知道 - 并且同意 - 数据结构。如果您尝试使用完全不同的结构来解释消息,则会进行精确的零保证。

  • 可能会抛出错误
  • 它可以工作并向你提出善意的胡言乱语
  • 它可以工作并保存作为未知字段所需的一切

一切皆有可能。

基本上:你不能依赖这种行为。

注意: 保证某些更改,例如添加或删除字段(确保以后不会重复使用不同的类型/含义)。这很好,期待。但其他变化根本没有定义。

  

我需要一种情况,我必须解析一些序列化的protobuf对象,如果一个解析器失败,我必须尝试另一个解析器。我该怎么解决这个问题呢。

你不能。