2012-01-23 23 views
1

我發送序列化大圖像對象通過UDP套接字。當我將所有接收的字節寫入內存流並傳遞內存流對象進行反序列化時,它會拋出例外對象類型「ImagePacket」沒有程序集標識。沒有對象類型'ImagePacket'.De的序列化異常捕獲C#

接收器端代碼:

    ImageStream = new MemoryStream(); 

       while (AccumulatingBytes <= TotalSizeOfComplexObject) 
       { 

        byte[] Recievedbytes = UdpListener.Receive(ref RemoteEndPoint); 

        ImageStream.Write(Recievedbytes, 0, Recievedbytes.Length); 

        AccumulatingBytes += Recievedbytes.Length; 
       } 


        ImageStream.Position = 0; 

        imagecontainer = (ImageContainer)bformater.Deserialize(ImageStream);//Here the Code Segment Breaks and Exception thrown 
+0

ImagePacket是你自己的類嗎? –

+0

是ImagePacket是我自己的類 – Samie

+0

[MSDN post](http://social.msdn.microsoft.com/Forums/eu/netfxremoting/thread/976b61ca-443f-4e6c-86d9-521542c4c8c8)表明這可以涉及流腐敗。在繼續之前,請檢查您收到的字節是否與發送的字節相同。特別是(正如我已經提到過的那樣),UDP並不關心準確度......如果你想要精確度,可以使用TCP。 –

回答

1

我懷疑這裏的問題很簡單:你正在使用UDP喜歡它是TCP。 UDP是基於數據包的,但a:不能保證數據包按順序到達,b:不能保證數據包不會被丟棄或重複。

我完全期望你有一些沒有秩序。如果您要發送多封郵件,也可能會有一些郵件被丟棄,並且您在下一封郵件中包含了一些郵件。

要使用網絡代碼想要使用它的方式:使用TCP。否則,理解亂序,丟棄和重複數據包的責任完全屬於您。例如,這可以通過向數據包添加序列號並跟蹤收到的內容 - 根據需要對其重新排序,丟棄重複數據,並重新請求在途中死亡的任何數據。基本上,重寫TCP添加的所有內容!除非你有一個非常具體的場景,否則很有可能TCP堆棧(帶有NIC和OS級別的支持)會比你做得更好。

+0

作爲一個側面說明:當**速度**是關鍵時,UDP是有意義的,並且您寧願擁有最新數據,即使這意味着您忽略了某些失敗;然而,你正在使用它作爲一個流 - 當數據是一個流,我會先看看TCP。 –

+0

我打算使用實時傳輸協議與UDP的結合,因爲大部分實現都是在UDP上完成的。請參閱http://en.wikipedia.org/wiki/Real-time_Transport_Protocol。 – Samie

相關問題