救命! 反序列化出错,不是每次都出 诡异 本帖最后由 ldz111222333 于 2011-06-08 22:26:20 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的程序是否使用了多线程?是否多个线程使用了public static object Deserialize(byte[] data)中的data?就异常来看应该是MemoryStream 的长度为0引起的,虽然你在函数中判断了data,但如果多个线程操作data,应该同步。 序列化我见过的有两种形式,这两种形式也就是以介质存储文件的性质来分别。利用BinaryFormatter类和XmlSerializer类。使用序列化的步骤也是大同小异。一、实例化流对象。二、实例化BinaryFormatter/XmlSerializer对象三、执行操作四、关闭流 我是用线程 但是没有在多个线程里面调用data呀我的业务逻辑是这样的:我调用摄像头处理类拍一张图,压缩成小jpg 封装到类里 再序列化发送到 我tcplistener上从监听上拿到scoket 从soket接收 data 反序列化 我处我发送的时候是用Timer控件 不停的拍照,压缩 发送的,soket不停的接收有的时候执行20多下 都不出错 一处错 我的监听还能连接上,但是线程就中断了求解呀 我把这个方法静态去掉,放到一个类 每次重新new 它 问题依旧呀 你这socket接收,是否可靠?取到的byte[]全是0,反序列化可不出错?服务端序列化成byte[]一定是65535长度吗?比这小的话,剩下的部分不就是0了么?另外,直接用byte[]构造MemoryStream就可以了,不用Write。MemoryStream ms = new MemoryStream(data); 我soket 接收的大小我也不能确定呀 所以我就给了个655535有的时候其他地方是0,怎么弄啊 我socket基础不行啊 这是我发送的代码我都发上来 private void SendVideo() { video.GrabImage(picMy.Handle, "C:\\send\\temp.Bmp"); //拍照 if (File.Exists("C:\\send\\temp.Bmp")) { comImg.Compress_Image("C:\\send\\temp.Bmp", "C:\\send\\my.jpg"); //压缩 if (File.Exists("C:\\send\\my.jpg")) { FileStream fs = File.OpenRead("C:\\send\\my.jpg"); long llen = fs.Length; int len = Convert.ToInt32(llen); byte[] imgData = new byte[len]; fs.Read(imgData, 0, len); VideoModel.VideoOKMessage vok = new VideoModel.VideoOKMessage(); vok.MName = txtUserName.Text; vok.ImgData = Encoding.Unicode.GetBytes(""); vok.ImgData = imgData; MyTool.SuperSerializeHelper super = new MyTool.SuperSerializeHelper(); //byte[] data = super.SerializeBinary(vok).ToArray(); byte[] data = super.Serialize(vok); TcpClient tc = new TcpClient(txtIP.Text, 2280); tc.Client.Send(data); //tc.Client.Disconnect(true); } } }这段代码有的时候出这个异常在 System.Runtime.InteropServices.ExternalException 中第一次偶然出现的“System.Drawing.dll”类型的异常我接收的地方我家里判断如下MyTool.SuperSerializeHelper super = new MyTool.SuperSerializeHelper();object obj = super.Deserialize(data);if (obj == null){ continue;}反序列化的地方我也改了public object Deserialize(byte[] data) { if (data.Length == 0) return null; try { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(data); //ms.Write(data, 0, data.Length); ms.Position = 0; object n = (object)bf.Deserialize(ms); ms.Close(); return n; } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.ToString()); return null; } }现在情况是这样发送端抛在 System.Runtime.InteropServices.ExternalException 中第一次偶然出现的“System.Drawing.dll”类型的异常接收端 原先一出异常线程就结束我加了判断改了反序列化的方法 也出异常但是线程不退出了.但是我看它出异常还是闹心 panel动态加载窗口问题 DriveInfo問題 C#新手下载什么编译工具? 这个问题太气人了 碰到个分割字符串的问题 达人来帮个忙 Visual studion 2008 的學習視頻 如何把光栅图转换为矢量图? PictureBox控件为什么在工具箱里看不到? 经典问题 Datatable(ADO.net,OLE DB)&Excel .net程序只能在windows系统下运行吗? 请教:C#程序中如何获取SQL Server触发器执行过程中的错误信息
是否多个线程使用了public static object Deserialize(byte[] data)中的data?
就异常来看应该是MemoryStream 的长度为0引起的,虽然你在函数中判断了data,但如果多个线程操作data,应该同步。
使用序列化的步骤也是大同小异。
一、实例化流对象。
二、实例化BinaryFormatter/XmlSerializer对象
三、执行操作
四、关闭流
我把这个方法静态去掉,放到一个类 每次重新new 它 问题依旧呀
服务端序列化成byte[]一定是65535长度吗?比这小的话,剩下的部分不就是0了么?另外,直接用byte[]构造MemoryStream就可以了,不用Write。
MemoryStream ms = new MemoryStream(data);
我soket 接收的大小我也不能确定呀 所以我就给了个655535
有的时候其他地方是0,怎么弄啊 我socket基础不行啊
我都发上来 private void SendVideo()
{
video.GrabImage(picMy.Handle, "C:\\send\\temp.Bmp");
//拍照
if (File.Exists("C:\\send\\temp.Bmp"))
{
comImg.Compress_Image("C:\\send\\temp.Bmp", "C:\\send\\my.jpg");
//压缩
if (File.Exists("C:\\send\\my.jpg"))
{
FileStream fs = File.OpenRead("C:\\send\\my.jpg"); long llen = fs.Length;
int len = Convert.ToInt32(llen); byte[] imgData = new byte[len]; fs.Read(imgData, 0, len);
VideoModel.VideoOKMessage vok = new VideoModel.VideoOKMessage(); vok.MName = txtUserName.Text; vok.ImgData = Encoding.Unicode.GetBytes("");
vok.ImgData = imgData; MyTool.SuperSerializeHelper super = new MyTool.SuperSerializeHelper();
//byte[] data = super.SerializeBinary(vok).ToArray();
byte[] data = super.Serialize(vok); TcpClient tc = new TcpClient(txtIP.Text, 2280); tc.Client.Send(data); //tc.Client.Disconnect(true);
}
}
}
这段代码有的时候出这个异常在 System.Runtime.InteropServices.ExternalException 中第一次偶然出现的“System.Drawing.dll”类型的异常我接收的地方我家里判断如下
MyTool.SuperSerializeHelper super = new MyTool.SuperSerializeHelper();object obj = super.Deserialize(data);if (obj == null)
{
continue;
}反序列化的地方我也改了
public object Deserialize(byte[] data)
{
if (data.Length == 0) return null;
try
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream(data);
//ms.Write(data, 0, data.Length);
ms.Position = 0;
object n = (object)bf.Deserialize(ms);
ms.Close();
return n;
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.ToString());
return null;
}
}现在情况是这样
发送端
抛在 System.Runtime.InteropServices.ExternalException 中第一次偶然出现的“System.Drawing.dll”类型的异常
接收端 原先一出异常线程就结束
我加了判断改了反序列化的方法 也出异常但是线程不退出了.但是我看它出异常还是闹心