2012-12-30 39 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