1
我正在用protobuf-net製作一個應用程序,用它來通過網絡發送/接收數據。對於protobuf-net,有沒有什麼情況下DeserializeWithLengthPrefix <T>可以拋出異常?
我很好奇是否/如何有人能送點東西,這將使該行拋出一個異常:
var message = Serializer.DeserializeWithLengthPrefix<ReceiveType>(
memoryStream, PrefixStyle.Fixed32);
我假設,通過這一點,我們已經檢查了:
- (編輯)整個消息已被接收並被放入一個
MemoryStream
,它將用於反序列化消息(即沒有流切斷的風險)。 - 長度前綴包含許多合理的大小(即不會耗盡內存)
- 消息正文與前綴所承諾的一樣大。
到目前爲止,我已經嘗試過各種可能性,在最壞的情況的message
場出來是null
或其他默認值,即使是必填字段,當郵件正文包含隨機亂碼。
巧合的是,昨天晚上我正在搞protobuf-net幾個小時,我發現如果你嘗試在一個已關閉的流上使用Serializer.DeserializeWithLengthPrefix(),那麼串行器就會出現。 DeserializeWithLengthPrefix ()'行會在運行時拋出一個錯誤。 –
2012-07-16 01:18:57
有趣,謝謝!我忘了在反序列化之前提到,我等待整個消息到達(基於長度前綴),然後從「MemoryStream」反序列化,即不存在流關閉的風險。我將編輯帖子以澄清。 – ikh 2012-07-16 01:33:49
@BrianSnow你得到一個異常或錯誤。因爲Sockets試圖在一個封閉的流上進行操作會拋出你需要捕獲的異常,所以我會說mark會跟着那些相當密切的。 – 2012-07-16 06:06:56