小弟要实现,从主程序传递一个byte[]数据到另一个线程,在byte[]到object的时候看不懂网上的代码,出现错误
class Program { static void Main(string[] args) { //主程序,从串口定时读取数据,保存到data这个byte[] //byte[] data = new byte[xx];//xx是个变化的量,最大会超过256,不到512 //为了方便测试,不管读串口的程序,用简单的3个数组来测试后续程序 byte[] data = new byte[3]; data[0]=11; data[1]=21; data[2] = 31; object O_data = Bytes2Object(data); Thread t = new Thread(new ParameterizedThreadStart(B)); //从网上查了下,线程传递一个参数,必须是object类型,然后有百度了一些byte[]转object函数 t.Start(O_data); Console.Read(); } private static void B(object obj) { Console.WriteLine("Method {0}!", obj.ToString()); } //网上直接贴来的函数,看不懂实现机制,想直接用下byte[]转object,用上面的3个数组测试,报下面 的错误 /// <summary> /// 将一个序列化后的byte[]数组还原 /// </summary> /// <param name="Bytes"></param> /// <returns></returns> public static object Bytes2Object(byte[] buff) { object obj; using (MemoryStream ms = new MemoryStream(buff)) { IFormatter iFormatter = new BinaryFormatter(); obj = iFormatter.Deserialize(ms);//在分析完成之前遇到流结尾,这里出错? } return obj; } /// <summary> /// 将一个object对象序列化,返回一个byte[] /// </summary> /// <param name="obj">能序列化的对象</param> /// <returns></returns> public static byte[] ObjectToBytes(object obj) { using (MemoryStream ms = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); return ms.GetBuffer(); } } }
解决方案
20
直接传就可以了,Bytes2Object和ObjectToBytes中两个函数可以不要。t.Start(data);原因是byte数组本来就是Object类型的数据。然后在你的B函数中在转换回来就可以了。
private static void B(object obj) { byte[] data = (byte[])obj; Console.WriteLine("Method {0}!", obj.ToString()); }
20
第一个问题:
线程参数类型是 Object,此时不是需要一个 Object 类型,而是 Object 是基本类型。
byte[] 也是 Object,可以直接传给线程当参数。
在使用的时候,直接转换成 byte[] 就可以使用。
不需要转换的。
第二个问题:
很多的 Object,例如你定义个类型,假如这个类型你需要保存起来,或传输给其他的使用者。
那么这个 Object 怎么保存呢?需要保存为二进制流,
此时就需要把 Object 转换为二进制流,这个操作就叫做 序列化和反序列化。(Serialize)
线程参数类型是 Object,此时不是需要一个 Object 类型,而是 Object 是基本类型。
byte[] 也是 Object,可以直接传给线程当参数。
在使用的时候,直接转换成 byte[] 就可以使用。
不需要转换的。
第二个问题:
很多的 Object,例如你定义个类型,假如这个类型你需要保存起来,或传输给其他的使用者。
那么这个 Object 怎么保存呢?需要保存为二进制流,
此时就需要把 Object 转换为二进制流,这个操作就叫做 序列化和反序列化。(Serialize)