【发布时间】:2018-04-01 21:01:32
【问题描述】:
我一直在为我的 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 对象,如果一个解析器失败,我必须尝试另一个解析器。我该如何解决这个问题。
谢谢。
【问题讨论】:
-
检查
getUnknownFields(或getUnknownFieldSet,或类似的内容。我忘记了确切的方法名称)。 -
但是,一般来说,
b.getDefaultInstanceForType() == b是错误的:使用equals来比较实例。 -
你通常会很难做到这一点,因为在 proto3 中字段默认为
optional。这意味着如果两条消息具有完全不同的字段(和字段 ID),它们仍然可以相互分配。只有内容会丢失,因为解析器假定它只是一个它不知道的可选字段。 -
但是在这个具体的例子中应该有一个错误,因为相同的字段 ID (1) 用于两种不同的类型。
-
@Matthias247 它可以通过“打包”逻辑进行解析,该逻辑将匹配长度前缀;不引起 varint 违规需要很大的运气,但理论上是可能的;我会认为除非它被“重复”它不会那样做,但是......嗯
标签: java protocol-buffers protobuf-java