序列化与反序列化 Socket中处理方法

本文介绍了一种用于文件传输的格式定义及其实现细节,包括客户端的序列化过程和服务器端的反序列化处理。通过二进制格式实现了高效的数据传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、声明公共类,需定义为公共类库,且server与client端需同时引用此公共类
[Serializable]
    public class FormatTransfer//文件传输格式
    {
        public int header=-1;//格式头,0为MAP文件传输,1为程序上传
        public string path;//存储路径
        public int fileDat;//Dat文件号
        public int fileTxt;//Txt文件号
        public int fileBmp;//Bmp文件号
        public int fileRar;//程序文件号
        public DateTime timeSend;//发送时间
        public string userID;//用户ID
        public string userName;//用户姓名
        public string userVprev;//用户权限
        public string userDept;//用户部门
    }

二、client发送端的序列化(此为二进制序列化格式,为图省事,XML方式测过一次,内存流搞错了,理论应该是一样的) 
                 sendFilesNo[0] = TxClient.SendFile(@"D:\Personal\桌面\1.dat");  //dat
                sendFilesNo[1] = TxClient.SendFile(@"D:\Personal\桌面\1.TXT");  //dat
                sendFilesNo[2] = TxClient.SendFile(@"D:\Personal\桌面\1.BMP");  //dat

                FormatTransfer ft = new FormatTransfer();
                ft.header = 0;
                ft.path=@"D:\DM\";
                ft.fileDat=sendFilesNo[0];
                ft.fileTxt=sendFilesNo[1];
                ft.fileBmp=sendFilesNo[2];
                ft.timeSend = DateTime.Now;
                ft.userName = userinfo.Name;
                ft.userID = userinfo.ID;
                //XmlSerializer xs = new XmlSerializer(typeof(FormatTransfer));   //XML序列化
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                //xs.Serialize(ms, ft);
                bf.Serialize(ms, ft);//将类型转换转换为内存流
                ms.Flush();
                byte[] buffer = new byte[1024];
                ms.Position = 0;  //将流的当前位置重新归0,否则Read方法将读取不到任何数据  
                while (ms.Read(buffer, 0, buffer.Length) > 0)
                {
                    TxClient.sendMessage(buffer); //从内存中读取二进制流,并发送  
                }  
                //TxClient.sendMessage(ms.ToArray());//发送字节组,此方法可能因溢出引起错误
                ms.Close();

                //发送接收后格式
                //TxClient.sendMessage(@"MAPF&D:\DM\#" + sendFilesNo[0].ToString() + "#" + sendFilesNo[1].ToString() + "#" + sendFilesNo[2].ToString() + "&" + userinfo.ID+"#"+userinfo.Name);//发送目录信息

//说明,备注代码全是瞎搞的,测了半天都搞错原理了



三、server接收端反序列化处理
        
/// <summary>
        /// 当接收到来之客户端的图片信息的时候
        /// </summary>
        /// <param name="ipEndPoint"></param>
        /// <param name="bytes"></param>
        private void acceptBytes(IPEndPoint ipEndPoint, byte[] bytes)
        {
            //MessageBox.Show(bytes.Length.ToString());
            //this.pictureBox1.Image = objectByte.ReadImage(bytes);
            MemoryStream ms = new MemoryStream(bytes);
            //byte[] buffer = new byte[1024]; 

            ms.Position = 0;
            //XmlSerializer xs = new XmlSerializer(typeof(FormatTransfer));   //XML反序列化
            //FormatTransfer ft = (FormatTransfer)xs.Deserialize(ms);
            //ms.Write(buffer, 0, buffer.Length); //将接收到的数据写入内存流
            //ms.Flush();
            BinaryFormatter bf = new BinaryFormatter();
            FormatTransfer ft = (FormatTransfer)bf.Deserialize(ms);
            ms.Close();
            MessageBox.Show(ft.userName);
        }

测试数据正常,效果刚刚的
说明:socket通讯类引用自开源的SanNiuSignal.dll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值