救命! 反序列化出错,不是每次都出 诡异

ldz111222333 2011-06-08 10:24:59
异常如下

在 System.Runtime.Serialization.SerializationException 中第一次偶然出现的“mscorlib.dll”类型的异常
System.Runtime.Serialization.SerializationException: 二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。
在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
在 MyTool.SerializeHelper.Deserialize(Byte[] data) 位置 C:\Documents and Settings\Administrator\桌面\视频部分\视频部分\VideoModel\VideoModel\SerializeHelper.cs:行号 54
在 System.NullReferenceException 中第一次偶然出现的“VideoServer.exe”类型的异常
线程 0x294 已退出,返回值为 0 (0x0)。


public static object Deserialize(byte[] data)
{
if (data.Length == 0) return null;
try
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
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;
}
}






我调用 反序列化的地方



byte[] data = new byte[65535];

s.ReceiveBufferSize = 999999;

s.Receive(data); // s是socket

//object obj = super.Deserialize(data);

//object obj = super.DeSerializeBinary((new System.IO.MemoryStream(data)));

object obj = MyTool.SerializeHelper.Deserialize(data);

Type objType = obj.GetType();

if (objType == typeof(VideoModel.VideoOKMessage))
{

VideoModel.VideoOKMessage vok = (VideoModel.VideoOKMessage)obj;

if (list.Keys.Contains(vok.MName))
{
list.Remove(vok.MName);
list.Add(vok.MName, vok);
}
else
{
list.Add(vok.MName, vok);
}

s.Disconnect(true);
Console.WriteLine("shoudao");

}



最诡异的事情不是每次都有异常 我把socke发送发到个timer控件里面 一般在重复执行10次左右的时候出现异常,高手帮我看看
拜谢!!!!
...全文
539 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldz111222333 2011-06-09
  • 打赏
  • 举报
回复
这是我发送的代码
我都发上来

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”类型的异常
接收端 原先一出异常线程就结束
我加了判断改了反序列化的方法 也出异常但是线程不退出了.但是我看它出异常还是闹心




ldz111222333 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fangxinggood 的回复:]
你这socket接收,是否可靠?取到的byte[]全是0,反序列化可不出错?
服务端序列化成byte[]一定是65535长度吗?比这小的话,剩下的部分不就是0了么?

另外,直接用byte[]构造MemoryStream就可以了,不用Write。
MemoryStream ms = new MemoryStream(data);
[/Quote]

我soket 接收的大小我也不能确定呀 所以我就给了个655535
有的时候其他地方是0,怎么弄啊 我socket基础不行啊

机器人 2011-06-09
  • 打赏
  • 举报
回复
你这socket接收,是否可靠?取到的byte[]全是0,反序列化可不出错?
服务端序列化成byte[]一定是65535长度吗?比这小的话,剩下的部分不就是0了么?

另外,直接用byte[]构造MemoryStream就可以了,不用Write。
MemoryStream ms = new MemoryStream(data);
yanran_hill 2011-06-09
  • 打赏
  • 举报
回复
把data的内容输出来看看
ldz111222333 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ghost5216 的回复:]
你的程序是否使用了多线程?
是否多个线程使用了public static object Deserialize(byte[] data)中的data?
就异常来看应该是MemoryStream 的长度为0引起的,虽然你在函数中判断了data,但如果多个线程操作data,应该同步。
[/Quote]

我把这个方法静态去掉,放到一个类 每次重新new 它 问题依旧呀
ldz111222333 2011-06-09
  • 打赏
  • 举报
回复
我是用线程 但是没有在多个线程里面调用data呀

我的业务逻辑是这样的:

我调用摄像头处理类拍一张图,压缩成小jpg 封装到类里 再序列化发送到 我tcplistener上

从监听上拿到scoket 从soket接收 data 反序列化

我处我发送的时候是用Timer控件 不停的拍照,压缩 发送的,soket不停的接收

有的时候执行20多下 都不出错 一处错 我的监听还能连接上,但是线程就中断了

求解呀


remember_me 2011-06-09
  • 打赏
  • 举报
回复
序列化我见过的有两种形式,这两种形式也就是以介质存储文件的性质来分别。利用BinaryFormatter类和XmlSerializer类。
使用序列化的步骤也是大同小异。
一、实例化流对象。
二、实例化BinaryFormatter/XmlSerializer对象
三、执行操作
四、关闭流

xuexiaodong2009 2011-06-09
  • 打赏
  • 举报
回复
data==null,没加这个判断
ghost5216 2011-06-09
  • 打赏
  • 举报
回复
你的程序是否使用了多线程?
是否多个线程使用了public static object Deserialize(byte[] data)中的data?
就异常来看应该是MemoryStream 的长度为0引起的,虽然你在函数中判断了data,但如果多个线程操作data,应该同步。

yinzheyihaoS 2011-06-08
  • 打赏
  • 举报
回复
帮忙顶!!!

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧