本帖最后由 xillscar 于 2012-06-01 13:43:00 编辑

解决方案 »

  1.   

    是不是因为 结构体中不能用ArrayList 这样的动态数组?
    如果是.那么我不可能去一条数据就封送一次吧?
    这样得多浪费啊?
    有没有其他的办法 可以把从数据库取出来的数据 全部按照一定的格式写入到结构体中进行统一封送? 
      

  2.   

    把 ArrayList 放在结构体了肯定有问题的,关键是读取这封送过去的数据的地方是怎样定义结构体的?
      

  3.   

    你这里只能用序列化的方式获得byte[],因为你的DateSkillList大小未知,里面含有ArrayList这样的不确定大小的数组。
      

  4.   

    补充一句 所有的结构体定义的时候都加了
    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode), Serializable]
      

  5.   

    StructToBytes 方法
    public static byte[] StructToBytes(object obj)
    {
        BinaryFormatter bf = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream())
        {
            bf.Serialize(stream, obj);
            return stream.ToArray();
        }
    }
      

  6.   

    补充一句 在封送到Tool的时候 异常提示为 无法计算有意义的大小或偏移量
      

  7.   

    反过来
    public static object BytesToStruct(byte[] array)
    {
        BinaryFormatter bf = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream(array))
        {
            return bf.Deserialize(stream);
        }
    }
      

  8.   

    用 BinaryFormatter  这个的话 我客户端的解析就不对了
      

  9.   

    取带有 ArrayList 时的结构体的长度是没有意义的,ArrayList 是引用类型,存放时就是个指针,大小就 4 字节,里面的内容不会算长度的
      

  10.   

    那两个结构体,提取出来,放在独立项目中,编译成 dll ,client 和 server 各放一份,引用这个 dll ,读取就没问题了
      

  11.   


    你是说我单独的吧 DateSkillList 和 Skillslistdate 编译成dll 做引用?
    就不用去修改tool的方法吗?
      

  12.   

    请参考WCF的序列化方式,可以做到两处各自定义的。
      

  13.   

    楼主的错误是在int size = Marshal.SizeOf(obj);的时候报错,其实也不是完全没辙,可以修改(重新设计)那个方法,让其识别结构体中的数组长度,然后对其进行填充,至于长度,用[MarshalAs(UnmanagedType.ByValArray, SizeConst = XXX)]标识即可。
      

  14.   

    是编译成dll 做引用,tool 里方法参照 8楼 和 10楼 的。
      

  15.   

    做成 dll 有个好处,修改结构时只要动一处代码
      

  16.   

    我粗略看了下,wcf 是 xml 方式的序列化?
      

  17.   


    在发送的封装的结构体中我定义了一个 byte abyte=0x16 这样的协议编号.用次方法之后 原来定义的byte类型的协议编号会变成另外的数据.客户端无法正确解析对应的协议