您的位置:首页 > 其它

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

2016-09-05 10:55 169 查看
一、声明公共类,需定义为公共类库,且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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐