C#,通过套接字通信进行二进制序列化。

4
我使用二进制序列化对象来读取或写入数据流,以前如果我们要写入/读取它们,我们必须将“实例类”编译为DLL文件,以便它们之间有相同的程序集,对吗?
现在,我的问题是:
这是我的二进制发送器代码:
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。其中Bitmap数据用于图像数据。如果我使用许多图像填充它,它将增加变量内存的大小,大约为20MB。
接下来,我将向所有客户端发送它们。那么,这里是我的问题:
使用此技术,如果对象的大小约为20MB,是否会工作良好?我知道Socket通信有发送数据的大小限制。
我不想定义任何协议,我只想使用Socket通信,尽管这可能不是最佳方式。
谢谢您的回复。

抛弃CanRead检查,因为它没有任何作用,如果为false会导致CPU烧毁100%...不过你的代码看起来很不错。 - usr
2个回答

2

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


Bitmap类被标记为可序列化,并实现了一些特定的代码来使用Data对其进行序列化。 - Simon Mourier

0

当文件大小超过几 MB 时,BinaryFormatter 将开始遇到问题。您考虑过使用使用更复杂的序列化技术的 开源通信库 吗?

使用 networkcomms.net,您的 send 方法会变成(您只需提供 RAW 对象,它会为您执行所有序列化操作):

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

在接收端,你的代码将会是这样的:
NetworkComms.AppendGlobalIncomingPacketHandler<object>("DataPacket", (header, connection, incomingObject) => { object mydat = incomingObject; });
TCPConnection.StartListening();

149英镑用于通过套接字发送序列化对象有点太贵了,不是吗?也许您可以提供一个简化版本,它不会造成如此大的财务压力。 - kungfooman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接