Deserialization 如何判断protobuf.net中的反序列化是否失败?

Deserialization 如何判断protobuf.net中的反序列化是否失败?,deserialization,protobuf-net,data-integrity,Deserialization,Protobuf Net,Data Integrity,我让protobuf.net将无效(随机)字节反序列化为KeyValuePair(即不可为null)。返回的不是(如预期的)异常,而是空结构 因为这个默认结构可能是有效数据,所以我看不到一种方法来判断源数据是否实际有效。这是一个错误,还是我错过了什么 (protobuf net 2.0.0.4802011.12.11)更新: 在v2中有一些场景,它不会发现这一点,而是会终止,就像它已经到达流的末尾一样-特别是如果应用移位后的“字段号”为非正。然而,这在protobuf流中是无效的,这将在下一次构

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

因为这个默认结构可能是有效数据,所以我看不到一种方法来判断源数据是否实际有效。这是一个错误,还是我错过了什么

(protobuf net 2.0.0.4802011.12.11)

更新:

在v2中有一些场景,它不会发现这一点,而是会终止,就像它已经到达流的末尾一样-特别是如果应用移位后的“字段号”为非正。然而,这在protobuf流中是无效的,这将在下一次构建中修复


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

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

如果我随机生成的数据碰巧是
{“foo”:“0”}
JavascriptSerializer
不会抱怨!!!臭虫

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

var ms = new MemoryStream();
ms.Write(randomBytes, 0, randomBytes.Length);
var obj = Serializer.Deserialize<Foo>(ms);
var ms=newmemoryStream();
ms.Write(randomBytes,0,randomBytes.Length);
var obj=序列化程序。反序列化(ms);
(零字节对于protobuf对象完全有效)

如果要测试流的有效性,可以使用
ProtoReader
,只需跳过(
SkipField()
或类似的内容)每个字段,直到
ReadNextHeader()
(或任何内容)返回非正整数。

更新:

在v2中有一些场景,它不会发现这一点,而是会终止,就像它已经到达流的末尾一样-特别是如果应用移位后的“字段号”为非正。然而,这在protobuf流中是无效的,这将在下一次构建中修复


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

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

如果我随机生成的数据碰巧是
{“foo”:“0”}
JavascriptSerializer
不会抱怨!!!臭虫

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

var ms = new MemoryStream();
ms.Write(randomBytes, 0, randomBytes.Length);
var obj = Serializer.Deserialize<Foo>(ms);
var ms=newmemoryStream();
ms.Write(randomBytes,0,randomBytes.Length);
var obj=序列化程序。反序列化(ms);
(零字节对于protobuf对象完全有效)


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

本例中的“随机”输入是一个XML文件,因此我认为它应该是非常无效的。不过,我会再次检查它,如果它没有抛出异常(如果它应该抛出异常的话),那将非常奇怪。@mafurtct您是否设法重新编译了它?我会非常感兴趣的一个例子,如果你这样做的话,我会更多地使用它,显然反序列化从来不会对我抛出,只要输入足够长。它只是返回默认值。@mafurtct,听起来与我所看到的一切都非常相反;你有什么具体的例子吗?在另一台机器上用新安装的VS'10进行了尝试,同样的结果。我使用protobuf-net.dll作为反序列化的输入。本例中的“随机”输入是一个XML文件,因此我认为它应该非常无效。不过,我会再次检查它,如果它没有抛出异常(如果它应该抛出异常的话),那将非常奇怪。@mafurtct您是否设法重新编译了它?我会非常感兴趣的一个例子,如果你这样做的话,我会更多地使用它,显然反序列化从来不会对我抛出,只要输入足够长。它只是返回默认值。@mafurtct,听起来与我所看到的一切都非常相反;你有什么具体的例子吗?在另一台机器上用新安装的VS'10进行了尝试,同样的结果。我使用protobuf-net.dll作为反序列化的输入。