2012-07-16 25 views
1

我正在用protobuf-net製作一個應用程序,用它來通過網絡發送/接收數據。對於protobuf-net,有沒有什麼情況下DeserializeWithLengthPrefix <T>可以拋出異常?

我很好奇是否/如何有人能送點東西,這將使該行拋出一個異常:

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

我假設,通過這一點,我們已經檢查了:

  • (編輯)整個消息已被接收並被放入一個MemoryStream,它將用於反序列化消息(即沒有流切斷的風險)。
  • 長度前綴包含許多合理的大小(即不會耗盡內存)
  • 消息正文與前綴所承諾的一樣大。

到目前爲止,我已經嘗試過各種可能性,在最壞的情況的message場出來是null或其他默認值,即使是必填字段,當郵件正文包含隨機亂碼。

+0

巧合的是,昨天晚上我正在搞protobuf-net幾個小時,我發現如果你嘗試在一個已關閉的流上使用Serializer.DeserializeWithLengthPrefix (),那麼串行器就會出現。 DeserializeWithLengthPrefix ()'行會在運行時拋出一個錯誤。 – 2012-07-16 01:18:57

+0

有趣,謝謝!我忘了在反序列化之前提到,我等待整個消息到達(基於長度前綴),然後從「MemoryStream」反序列化,即不存在流關閉的風險。我將編輯帖子以澄清。 – ikh 2012-07-16 01:33:49

+0

@BrianSnow你得到一個異常或錯誤。因爲Sockets試圖在一個封閉的流上進行操作會拋出你需要捕獲的異常,所以我會說mark會跟着那些相當密切的。 – 2012-07-16 06:06:56

回答

1

,並在郵件正文包含隨機亂碼

不大。通常會使它拋出「無效線型」異常。你也可以得到有關格式不正確的varints,UTF8和其他一些內容的錯誤。該消息必須是有效的protobuf數據。有些東西它不會檢測到,但在大多數情況下,它會喊你無效的數據。

顯然任何代碼在ReceiveType故意爆炸(說,一個屬性得到)會導致它失敗 - 所以模型/ DTO也必須有意義!

相關問題