照你的方法传个OBJECT进来就成了吧剩下的都是方法内部的事情了~

解决方案 »

  1.   

    变长数组,建议更换为ArrayList。
      

  2.   

    定义一个arraylist,可那也得写一个特性[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]的呀,这里还是把长度给限制了
      

  3.   

    为什么要写。直接New一个空的就ok了。
      

  4.   

    这个根本就是不可能的,定长的数组决定了一次传送的字节始终是固定的长度,接收端收到的数据也能够按照这个长度恢复成对象,如果设置为变长就算是发送出去了接收端因为不知道发送的字节数是多少,根本就不可能解析出来。其根本原因还是数组在C#里面都是引用类型,而不是值类型。
    同理字符串也是一样的需要用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]声明想一下C++里面的结构的字段声明成指针再用Socket发送出去会是什么样的情况吧
      

  5.   

    自已写个辅助方法把结构的一个字段一个字段的写到内存流中,遇到数组或字符串这种长度不定的类型先写入一个或两个字节表示长度的值,把数组元素或字符串转成后的字节数组的内容一个一个输出
    再把内存流的内容发送到Socket里去,我就是这样干的 public struct Data
        {
            public string UsersName;
            public byte[] ByteData;    }public byte[] GetBytes(Data d)
    {
      MemoryStream ms = new MemoryStream();
      byte[] strArray = d.UserName == null ? new byte[0] : Encoding.UTF8.GetBytes(d.UserName);
      ms.WriteByte((byte)strArray.Length); // 这里到底是用什么整型表示长度由事先约定,发送和接收端使用一样的就行,必要时可用BitConverter类的方法转换,下同
      ms.Write(strArray, 0, strArray.Length);
      if(d.ByteData == null)
        ms.Write(0);
      else
      {
        ms.WriteByte((byte)d.ByteData.Length);
        ms.Write(d.ByteData, 0, d.ByteData.Length);
      }
      return ms.ToArray();
    }
     解析的时候先读取一个长度,由之前的约定决定到底读几个字节表示长度,根据这个长度再决定后面需要读取的数据块,这样基本上就可以还原了。
    需要注意的是发送时写入流的顺序和接收端分析还原字段的顺序是一致的,也就是说先发送的是UserName,那么先分析到的也是UserName
      

  6.   

    变长数组,直接用List就可以了