我用C#开发一个socket的程序,其中定义了一个结构如下:
struct Student
{
string strName;
long nAge;
};程序中会这样使用
Student cStudent = new Student();
cStudent.strName = "张三";
cStudent.nAge = 15;发送数据的结构如下:
struct Data
{
long nPackageID; // 当前数据包的编号
long nSize; // 当前数据包的总长度,Data 的长度
Student cStudent;
}程序中会这样用:
Data cData = new Data();
cData.nPackageID = 1;
cData.nSize = XXX; // 目前如何得到总长还不知道
cData.cStudent = cStudent;现在需要将 cData 的内容发到服务器。我可以将每一个信息取出来然后
拼接到一个byte的数组,最后发出去。服务器端按照同样规则可以把接收
到信息解析出来,这个不难,但是一边编码,另一边解码我觉得麻烦。能不能直接将 cData 转换成 byte 数组类型并获得长度,然后直接发送
服务端收到后直接转换成 Data 类型从而获得内容。这样可以节省一些代
码,各位有没有办法?如果解决另开贴重谢。
struct Student
{
string strName;
long nAge;
};程序中会这样使用
Student cStudent = new Student();
cStudent.strName = "张三";
cStudent.nAge = 15;发送数据的结构如下:
struct Data
{
long nPackageID; // 当前数据包的编号
long nSize; // 当前数据包的总长度,Data 的长度
Student cStudent;
}程序中会这样用:
Data cData = new Data();
cData.nPackageID = 1;
cData.nSize = XXX; // 目前如何得到总长还不知道
cData.cStudent = cStudent;现在需要将 cData 的内容发到服务器。我可以将每一个信息取出来然后
拼接到一个byte的数组,最后发出去。服务器端按照同样规则可以把接收
到信息解析出来,这个不难,但是一边编码,另一边解码我觉得麻烦。能不能直接将 cData 转换成 byte 数组类型并获得长度,然后直接发送
服务端收到后直接转换成 Data 类型从而获得内容。这样可以节省一些代
码,各位有没有办法?如果解决另开贴重谢。
Formatter.WriteValueType 或是Formatter成员的其他函数,你试试吧.
BinaryFormatter 类
hyj_828(水梦)的方法还是要自己做,只是封装了一下
lidong6(立冬) 和Ivony()的方法只能序列化到流中,我需要
放在byte的数组通过socket发送。另外接收端用同样的方法也
能解析出数据才行。感觉c的强制类型转换,内存字节复制和指
针还是方便。有没有好的办法?或者上面的人能给一个例子(针对byte的,流
的例子msdn中有)
[Serializable]
public class Production : Object
{
public long nSize;
public string strName;
};
...Production cSendProduction = new Production();
Production cRecvProduction = new Production();
BinaryFormatter cBinaryFormat = new BinaryFormatter();
MemoryStream cMemStream = new MemoryStream();
byte[] strSendBuff = new byte[512];
byte[] strRecvBuff = new byte[512];cSendProduction.nSize = 10;
cSendProduction.strName = "Frank";// 打包数据
cBinaryFormat.Serialize(cMemStream, cSendProduction);
strSendBuff = cMemStream.ToArray();
// 模拟 socket 发送/接收
strSendBuff.CopyTo(strRecvBuff, 0);
// 解包数据
cMemStream = new MemoryStream(strRecvBuff);
cRecvProduction = (Production)cBinaryFormat.Deserialize(cMemStream);