2012-12-30 40 views
4

我使用二進制序列化對象來讀取或寫入數據流,以前如果我們要寫/讀它們,我們必須編譯「實例類」爲DLL文件,所以我們有他們之間是同樣的組合,對嗎?C#,通過Socket通信的二進制序列化

現在好了,這裏是我的問題:

這是我的二進制發送方碼

public void SendBinarySerial(object graph) 
{ 
    IFormatter formatter = new BinaryFormatter(); 

    System.Net.Sockets.NetworkStream strm = mClient.GetStream(); //get TCPclient stream 

    formatter.Serialize(strm, graph); 
} 

,這裏是我的二進制接收器代碼:

private void doRead() 
{ 
    do 
    { 
     if (mClient.GetStream().CanRead) 
      { 
      System.Net.Sockets.NetworkStream strm = mClient.GetStream(); 

       IFormatter formatter = new BinaryFormatter(); 

       object mydat = (object)formatter.Deserialize(strm);//deserialize data receiver   
      } 
    } while (true); 
} 

這是我「實例類「我想要發送給整個客戶端的代碼。 OK讓我們考慮下面的代碼:

[Serializable()] 
public class DataSend 
{ 
    public List<Bitmap> MainData = new List<Bitmap>(); 
    public List<string> Title = new List<string>(); 
} 

正如你所看到的,有幾個列表變量如Bitmap和字符串。 位圖數據用於圖像數據。如果我用很多圖片填充它,它會增加可變內存的大小,大概是20 MB。

之後,我即將把它們發送給整個客戶。那麼,這是我的問題:

使用這種技術,如果大小對象大約20 MB,這將工作好嗎?我知道Socket通信有發送數據的大小限制

我不想定義任何協議,我只是想使用套接字通信,儘管也許這不是最好的方法。

感謝您的回覆。

+0

拋棄'CanRead'檢查,因爲它不會做任何事情,並導致100%的CPU燃燒,如果虛假...你的代碼看起來不錯。 – usr

回答

2

我不會擔心使用套接字的大小限制。根據我的經驗,可以從NetworkStream讀取/寫入任意大小的數據。然而,我會擔心Bitmap對象的可串行化。據我所知,這將不會序列化圖像數據。

+0

Bitmap類標記爲可序列化,並實現一些特定的代碼以使用數據對其進行序列化。 –

0

一旦您的文件大小高於幾MB,BinaryFormatter將真的開始掙扎。你有沒有考慮使用open source communication library,它使用更復雜的序列化技術?

使用networkcomms.net您發送方法將成爲(你只需要提供RAW對象和它所有的系列化你):

NetworkComms.SendObject("DataPacket", ipAddress, port, object); 

在接收端,你的代碼是:

NetworkComms.AppendGlobalIncomingPacketHandler<object>("DataPacket", (header, connection, incomingObject) => { object mydat = incomingObject; }); 
TCPConnection.StartListening(); 
+0

149磅通過套接字發送序列化的對象是多少,或?也許你可以提供一個簡潔的版本,它不會在口袋裏造成這樣的洞。 – lama12345