【发布时间】:2012-07-16 13:29:10
【问题描述】:
我正在使用 protobuf-net 制作一个应用程序,使用它通过网络发送/接收数据。
我很好奇某人是否/如何发送一些东西,这会使该行抛出异常:
var message = Serializer.DeserializeWithLengthPrefix<ReceiveType>(
memoryStream, PrefixStyle.Fixed32);
我假设到目前为止我们已经检查过:
- (编辑)已收到整条消息并将其放入
MemoryStream,该MemoryStream将用于反序列化消息(即没有流中断的风险)。 - 长度前缀包含一些合理的大小(即不会耗尽内存)
- 消息正文与前缀所承诺的一样大。
到目前为止,我已经尝试了各种可能性,最坏的情况是 message 字段显示为 null 或其他默认值,即使对于必填字段和消息正文包含随机乱码也是如此。
【问题讨论】:
-
巧合的是,我昨晚在 protobuf-net 上玩了几个小时,我发现如果您尝试在已关闭的流上使用
Serializer.DeserializeWithLengthPrefix<T>(),Serializer.DeserializeWithLengthPrefix<T>()行将在运行时抛出错误。 -
有趣,谢谢!我忘了提一下,在反序列化之前,我等待整个消息到达(基于长度前缀)然后从
MemoryStream反序列化,即没有关闭流的风险。我将编辑帖子以澄清。 -
@BrianSnow 您遇到异常还是错误。因为尝试使用 Sockets 对关闭的流进行操作会引发您需要捕获的异常,所以我想说 mark 会非常密切地关注这些异常。
-
@PaulFarry 这是一个例外,我确实抓住了。我是新手,其实我并不知道异常和错误是两个不同的东西!
-
编辑我上面的评论为时已晚,但为了确定:如果我发现
catch (Exception e) {}的错误/异常,我是否正确地假设这意味着它确实是一个异常?跨度>
标签: c# protocol-buffers protobuf-net