小弟要实现,从主程序传递一个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)