1

我让 protobuf.net 将无效(随机)字节反序列化为 KeyValuePair(即不可为空)。不是(如预期的那样)抛出异常,而是返回了一个空结构。

由于此默认结构可能是有效数据,因此我看不到判断源数据是否实际有效的方法。这是一个错误,还是我错过了一种方法?

(protobuf-net 2.0.0.480, 2011.12.11)

4

1 回答 1

1

更新:

在 v2 中的某些情况下,它不会发现这一点,而是会终止,就好像它已经到达流的末尾 - 特别是如果“字段编号”在应用移位之后是非正数时。但是,这在 protobuf 流中无效,这将在下一次构建中修复。


这取决于它的随机性;p 实际上,让它在不引发错误的情况下做任何事情是非常令人印象深刻的——protobuf 规范对布局非常具体,通常它在那里抛出一个很大的异常(可能提到“意外的线-类型”或类似)。

强调:几乎在所有情况下它都会抛出异常。如果您对正确规范的某些数据进行了侥幸,但字段编号不同,那么它将默默地忽略意外数据,您将获得一个全零的结构。如果您侥幸获得正确规范的一些数据,但使用正确的字段编号和布局,您将得到垃圾。但这就像说

如果我随机生成碰巧碰巧的数据,请{"foo":"0"}不要JavascriptSerializer抱怨!!!漏洞!!!

确定你真的在这里反序列化了一些数据吗?并且流还不是EOF位置?例如,以下内容不会出错,因为您没有倒带流 - 您正在有效地反序列化零字节:

var ms = new MemoryStream();
ms.Write(randomBytes, 0, randomBytes.Length);
var obj = Serializer.Deserialize<Foo>(ms);

(零字节对于 protobuf 对象是完全有效的)

如果您想测试流的有效性,您可以使用ProtoReader, 只是跳过(SkipField()或类似的东西)每个字段,直到ReadNextHeader()(或其他)返回一个非正整数。

于 2012-02-22T16:44:15.647 回答