背景:
1.结构体很多,用BitCovert手动转的话,可能会死人。
2.是用于Socket通信,服务器端是C++已经写好,不能改,也就是说序列化不能用。
3.unsafe 的话同样面临第一点的问题.
4.由于平台原因,不能使用Marshal.能否有好一点的解决方案?
thank you.

解决方案 »

  1.   

    不能使用Marshal?,那你就根据结构体的字段长度,挨个从byte[]中读取吧
    或者你用c++写个一个dll,里面传入ref 结构体,然后在 dll中对结构体字段赋值,然后返回给你
      

  2.   


    [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)] //,Size=16        public struct TestStruct        {            [MarshalAs(UnmanagedType.R8)] //,FieldOffset(0)]             public double dTest;            [MarshalAs(UnmanagedType.U2)] //, FieldOffset(8)]            public UInt16 uTest;            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] //, FieldOffset(10)]            public byte[] bTest;        }        //序列化        public static byte[] rawSerialize(object obj)        {            int rawsize = Marshal.SizeOf(obj);            IntPtr buffer = Marshal.AllocHGlobal(rawsize);            Marshal.StructureToPtr(obj, buffer, false);            byte[] rawdatas = new byte[rawsize];            Marshal.Copy(buffer, rawdatas, 0, rawsize);            Marshal.FreeHGlobal(buffer);            return rawdatas;        }        //反序列化        public static TestStruct rawDeserialize(byte[] rawdatas)        {            Type anytype = typeof(TestStruct);           int rawsize = Marshal.SizeOf(anytype);            if (rawsize > rawdatas.Length) return new TestStruct();            IntPtr buffer = Marshal.AllocHGlobal(rawsize);            Marshal.Copy(rawdatas, 0, buffer, rawsize);            object retobj = Marshal.PtrToStructure(buffer, anytype);            Marshal.FreeHGlobal(buffer);            return (TestStruct)retobj;        }              }
      

  3.   


    哥,你是大哥,都说了IOS平台不支持 Marshal。
      

  4.   


    不用呀,写一个函数,俩参数,一个结构体,一个结构体长度,然后byte[i]=*((byte*)(&结构体)+i),一个一个读呗
      

  5.   

    c#里第二参数怎么写?
    S2B<T>(int size,T obj); //明显不对
    S2Bint size,object obj);//调用的时候强转类型会出错
      

  6.   


    这样试试:
    unsafe byte[] S2B(int size, byte* obj)
            {
                byte[] b = new byte[size];
                for (int i = 0; i < b.Length; i++)
                {
                    b[i] = *(obj + i);
                }
                return b;
            }
      

  7.   


    额,我发现我的类无法用指针。
    报错:
    无法取得托管类型的地址和大小,或无法说明指向他的指针。类大概结构
    Class A
    {    
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = CONST.MAX_PLAYER_ENAME_LEN)] 
        public char[] szPlayerName;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = CONST.MAX_PLAYER_PWD_LEN)]
        public char[] szPlayerPwd;
        public ulong u64Mac; 

    使用:
    unsafe 
    {
    A *a;//报错?
    }
      

  8.   

    Class在堆里,属于托管内存,没法用指针的
      

  9.   


    哦,我试试。
    那还有,有没有什么方法能遍历class的成员,有的话,我就可以逐个的用BitCovert了。
      

  10.   


    struct 不能继承?
    各种问题太多了吧?
      

  11.   

    为何要用Class,不是要传个数据吗?结构体完全够用吧
      

  12.   

    你自己一开始都说了,是结构体,跑后面突然变为了类,结构体和类存在本质的区别,即使可以用Marshal,对于类也获取不到byte[]字节。对于类,必须自己写属性遍历,可能的话直接在定义的时候实现序列化方法。