本帖最后由 ldz111222333 于 2011-06-08 22:26:20 编辑

解决方案 »

  1.   

    你的程序是否使用了多线程?
    是否多个线程使用了public static object Deserialize(byte[] data)中的data?
    就异常来看应该是MemoryStream 的长度为0引起的,虽然你在函数中判断了data,但如果多个线程操作data,应该同步。
      

  2.   

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

  3.   

    我是用线程 但是没有在多个线程里面调用data呀我的业务逻辑是这样的:我调用摄像头处理类拍一张图,压缩成小jpg 封装到类里 再序列化发送到 我tcplistener上从监听上拿到scoket 从soket接收 data 反序列化 我处我发送的时候是用Timer控件 不停的拍照,压缩 发送的,soket不停的接收有的时候执行20多下 都不出错 一处错 我的监听还能连接上,但是线程就中断了求解呀
      

  4.   


    我把这个方法静态去掉,放到一个类 每次重新new 它 问题依旧呀
      

  5.   

    你这socket接收,是否可靠?取到的byte[]全是0,反序列化可不出错?
    服务端序列化成byte[]一定是65535长度吗?比这小的话,剩下的部分不就是0了么?另外,直接用byte[]构造MemoryStream就可以了,不用Write。
    MemoryStream ms = new MemoryStream(data);
      

  6.   


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

  7.   

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