【问题标题】:For protobuf-net, are there any circumstances under which DeserializeWithLengthPrefix<T> can throw an exception?对于 protobuf-net,是否有任何情况下 DeserializeWithLengthPrefix<T> 可以抛出异常?
【发布时间】:2012-07-16 13:29:10
【问题描述】:

我正在使用 protobuf-net 制作一个应用程序,使用它通过网络发送/接收数据。

我很好奇某人是否/如何发送一些东西,这会使该行抛出异常:

var message = Serializer.DeserializeWithLengthPrefix<ReceiveType>(
                                   memoryStream, PrefixStyle.Fixed32);

我假设到目前为止我们已经检查过:

  • (编辑)已收到整条消息并将其放入MemoryStream,该MemoryStream 将用于反序列化消息(即没有流中断的风险)。
  • 长度前缀包含一些合理的大小(即不会耗尽内存)
  • 消息正文与前缀所承诺的一样大。

到目前为止,我已经尝试了各种可能性,最坏的情况是 message 字段显示为 null 或其他默认值,即使对于必填字段和消息正文包含随机乱码也是如此。

【问题讨论】:

  • 巧合的是,我昨晚在 protobuf-net 上玩了几个小时,我发现如果您尝试在已关闭的流上使用 Serializer.DeserializeWithLengthPrefix&lt;T&gt;()Serializer.DeserializeWithLengthPrefix&lt;T&gt;()行将在运行时抛出错误。
  • 有趣,谢谢!我忘了提一下,在反序列化之前,我等待整个消息到达(基于长度前缀)然后从 MemoryStream 反序列化,即没有关闭流的风险。我将编辑帖子以澄清。
  • @BrianSnow 您遇到异常还是错误。因为尝试使用 Sockets 对关闭的流进行操作会引发您需要捕获的异常,所以我想说 mark 会非常密切地关注这些异常。
  • @PaulFarry 这是一个例外,我确实抓住了。我是新手,其实我并不知道异常和错误是两个不同的东西!
  • 编辑我上面的评论为时已晚,但为了确定:如果我发现catch (Exception e) {} 的错误/异常,我是否正确地假设这意味着它确实是一个异常?跨度>

标签: c# protocol-buffers protobuf-net


【解决方案1】:

当消息正文包含随机乱码时

不完全是。乱码一般会使其抛出“无效的电线类型”异常。您还可能会收到有关格式错误的 varint、UTF8 和其他一些内容的错误。消息必须是有效的 protobuf 数据。有些东西它不会检测到,但在大多数情况下,它会因为无效数据而对你大喊大叫。

显然,ReceiveType 中任何有意爆炸的代码(例如,属性获取)都会导致它失败 - 所以模型/DTO 也必须有意义!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多