我用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 类型从而获得内容。这样可以节省一些代
码,各位有没有办法?如果解决另开贴重谢。

解决方案 »

  1.   

    你不知道自己在這個結構裏面寫一個方法實現阿.類似ToString,只是你是ToBytes
      

  2.   

    类库中有一个转换结构为数组的方法,记的不太清楚.好像是这一个:
    Formatter.WriteValueType 或是Formatter成员的其他函数,你试试吧.
      

  3.   

    序列化。参阅:
    BinaryFormatter 类
      

  4.   

    我看过了,好像还是不行。
    hyj_828(水梦)的方法还是要自己做,只是封装了一下
    lidong6(立冬) 和Ivony()的方法只能序列化到流中,我需要
    放在byte的数组通过socket发送。另外接收端用同样的方法也
    能解析出数据才行。感觉c的强制类型转换,内存字节复制和指
    针还是方便。有没有好的办法?或者上面的人能给一个例子(针对byte的,流
    的例子msdn中有)
      

  5.   

    我自己解决了,贴出代码片断,共享一下吧。
    [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);