C#,套接字通信的二进制序列化

时间:2012-12-30 06:32:40

标签: c# sockets visual-studio-2008 network-programming

我使用二进制序列化对象来读取或写入数据流,如果我们要编写/读取它们,我们必须将“实例类”编译为DLL文件,因此我们有相同的Assemblies他们之间,是不是?

现在好了,这是我的问题:

这是我的二进制发件人代码

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);
}

这是我想要发送给整个客户端的“实例类”代码。 好我们考虑以下代码:

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

如您所见,有几个 List 变量,如Bitmap和string。 位图数据用于图像数据。如果我用很多图像填充它会增加可变内存的大小,可能大约20 mb。

之后,我即将把它们发送给整个客户。好吧,这是我的问题:

使用这种技术,如果大小对象大约是20 mb,这会有效吗?我知道套接字通信具有发送数据的大小限制

我根本不想定义任何协议,我只是想使用套接字通信,虽然这可能不是最好的方法。

感谢您的回复。

2 个答案:

答案 0 :(得分:2)

我不担心使用套接字的大小限制。根据我的经验,可以从NetworkStream读取/写入任意大小。但是我会担心Bitmap对象的可串行性。据我所知,这不会序列化图像数据。

答案 1 :(得分:0)

一旦文件大小超过几MB,BinaryFormatter就会开始挣扎。您是否考虑使用open source communication library使用更复杂的序列化技术?

使用networkcomms.net你的send方法会变成(你只提供RAW对象并为你完成所有的序列化):

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

在接收端,你的代码是:

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