2

我一直在为我的 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));

此代码正常工作,结果为“假”。

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

谢谢。

4

1 回答 1

3

Protobuf 的前提是两端都预先知道 - 并同意 - 数据结构。如果您试图解释具有完全不同结构的消息,则保证完全为零。

  • 它可能会引发错误
  • 它可以工作并向您展示善意的胡言乱语
  • 它可以工作并将所需的所有内容保存为未知字段

一切皆有可能。

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

注意:对于某些更改,例如添加或删除字段(确保它们以后不会以不同的类型/含义重用),有保证这很好,也是意料之中的。但其他变化根本没有定义。


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

你不能。

于 2018-04-01T21:30:13.877 回答