C# 含动态数组的结构体封送问题 本帖最后由 xillscar 于 2012-06-01 13:43:00 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是因为 结构体中不能用ArrayList 这样的动态数组?如果是.那么我不可能去一条数据就封送一次吧?这样得多浪费啊?有没有其他的办法 可以把从数据库取出来的数据 全部按照一定的格式写入到结构体中进行统一封送? 把 ArrayList 放在结构体了肯定有问题的,关键是读取这封送过去的数据的地方是怎样定义结构体的? 你这里只能用序列化的方式获得byte[],因为你的DateSkillList大小未知,里面含有ArrayList这样的不确定大小的数组。 补充一句 所有的结构体定义的时候都加了[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode), Serializable] StructToBytes 方法public static byte[] StructToBytes(object obj){ BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream stream = new MemoryStream()) { bf.Serialize(stream, obj); return stream.ToArray(); }} 补充一句 在封送到Tool的时候 异常提示为 无法计算有意义的大小或偏移量 反过来public static object BytesToStruct(byte[] array){ BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream stream = new MemoryStream(array)) { return bf.Deserialize(stream); }} 用 BinaryFormatter 这个的话 我客户端的解析就不对了 取带有 ArrayList 时的结构体的长度是没有意义的,ArrayList 是引用类型,存放时就是个指针,大小就 4 字节,里面的内容不会算长度的 那两个结构体,提取出来,放在独立项目中,编译成 dll ,client 和 server 各放一份,引用这个 dll ,读取就没问题了 你是说我单独的吧 DateSkillList 和 Skillslistdate 编译成dll 做引用?就不用去修改tool的方法吗? 请参考WCF的序列化方式,可以做到两处各自定义的。 楼主的错误是在int size = Marshal.SizeOf(obj);的时候报错,其实也不是完全没辙,可以修改(重新设计)那个方法,让其识别结构体中的数组长度,然后对其进行填充,至于长度,用[MarshalAs(UnmanagedType.ByValArray, SizeConst = XXX)]标识即可。 是编译成dll 做引用,tool 里方法参照 8楼 和 10楼 的。 做成 dll 有个好处,修改结构时只要动一处代码 我粗略看了下,wcf 是 xml 方式的序列化? 在发送的封装的结构体中我定义了一个 byte abyte=0x16 这样的协议编号.用次方法之后 原来定义的byte类型的协议编号会变成另外的数据.客户端无法正确解析对应的协议 如何将xml文件映射成一个实体类? 如何保留2位小数 win7使用VS2008的问题 时间差问题 关于user control问题 如何通过程序提高E-mail送邮件的速度? Net 数据 OLE DB 提供程序(System.Data.OleDb)要求 Microsoft 数据访问组件(MDAC) 2.6 或更高版本。发现当前安装的版本是 2.52.6019.0 请问一个数据处理的方法,谢谢指点,在线等答案 如何限制登录时间 如何调用button1_keyUp事件 重写tabControl的onPaint方法。 求如何实现VS与Blend同步操作……
如果是.那么我不可能去一条数据就封送一次吧?
这样得多浪费啊?
有没有其他的办法 可以把从数据库取出来的数据 全部按照一定的格式写入到结构体中进行统一封送?
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode), Serializable]
public static byte[] StructToBytes(object obj)
{
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
bf.Serialize(stream, obj);
return stream.ToArray();
}
}
public static object BytesToStruct(byte[] array)
{
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream(array))
{
return bf.Deserialize(stream);
}
}
你是说我单独的吧 DateSkillList 和 Skillslistdate 编译成dll 做引用?
就不用去修改tool的方法吗?
在发送的封装的结构体中我定义了一个 byte abyte=0x16 这样的协议编号.用次方法之后 原来定义的byte类型的协议编号会变成另外的数据.客户端无法正确解析对应的协议