客户端通过TCPIP访问服务器端,取回被序列化的dataset,然后反序列化。
但是同样的操作,有时候出,有时候正常,很是郁闷。dataset中有汉字内容服务端
        public static byte[] DataSetSerializerCompression(DataSet ds) 
        {
            string tmp = Path.Combine(
                Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), 
                string.Concat(Guid.NewGuid().ToString(),".dat"));
            try
            {
                IFormatter formatter = new BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象                MemoryStream ms = new MemoryStream();//创建内存流对象                formatter.Serialize(ms, ds);//把DataSet对象序列化到内存流                byte[] buffer = ms.ToArray();//把内存流对象写入字节数组                ms.Close();//关闭内存流对象                ms.Dispose();//释放资源                FileStream fs = File.Create(tmp);//创建文件                GZipStream gzipStream = new GZipStream(fs, CompressionMode.Compress, true);//创建压缩对象                gzipStream.Write(buffer, 0, buffer.Length);//把压缩后的数据写入文件                gzipStream.Close();//关闭压缩流,这里要注意:一定要关闭,要不然解压缩的时候会出现小于4K的文件读取不到数据,大于4K的文件读取不完整                gzipStream.Dispose();//释放对象                fs.Close();//关闭流                fs.Dispose();//释放对象                buffer = File.ReadAllBytes(tmp);// 读取应用软件所在目录下的文件
                return buffer;            }
            finally
            {
                if (File.Exists(tmp))
                {
                    File.Delete(tmp);
                }
            }
        } 
客户端:
        public static DataSet DataSetDeserializeDecompre(byte[] b)
        {
            string tmp = Path.Combine(
                Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
                string.Concat(Guid.NewGuid().ToString(), ".dat"));
            try
            {
                FileStream fss = File.Create(tmp);//创建文件
                fss.Close();
                File.WriteAllBytes(tmp, b);                FileStream fs = File.OpenRead(tmp);//打开文件                  fs.Position = 0;//设置文件流的位置                  GZipStream gzipStream = new GZipStream(fs, CompressionMode.Decompress);//创建解压对象                  byte[] buffer = new byte[10240];//定义数据缓冲                  int offset = 0;//定义读取位置                  MemoryStream ms = new MemoryStream();//定义内存流                  while ((offset = gzipStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    ms.Write(buffer, 0, offset);//解压后的数据写入内存流  
                }                BinaryFormatter sfFormatter = new BinaryFormatter();//定义BinaryFormatter以反序列化DataSet对象                  ms.Position = 0;//设置内存流的位置                  DataSet ds;                try
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    ds = (DataSet)sfFormatter.Deserialize(ms);//反序列化 
                }
                catch
                {
                    throw;
                }
                finally
                {
                    ms.Close();//关闭内存流  
                    ms.Dispose();//释放资源
                    fs.Close();//关闭文件流  
                    fs.Dispose();//释放资源  
                    gzipStream.Close();//关闭解压缩流  
                    gzipStream.Dispose();// 
                }
                //释放资源  
                return ds;
            }
            finally
            {
                if (File.Exists(tmp))
                {
                    File.Delete(tmp);
                }
            }
        } 

解决方案 »

  1.   

    问题出在               try
                    {
                        ms.Seek(0, SeekOrigin.Begin);
                        ds = (DataSet)sfFormatter.Deserialize(ms);//反序列化 
                    }
                    catch
                    {
                        throw;
                    }
      

  2.   

    用比如: ms.Position=0 来试试,没试,不知对否
      

  3.   

    http://topic.csdn.net/t/20040819/20/3291662.htmlhttp://msdn.microsoft.com/zh-cn/library/system.text.decoderfallbackexception(VS.95).aspxhttp://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/d52a06cb-a75f-4eab-9284-5e9b3bbfeaf8你的服务端电脑和客户端电脑都是一样的中文系统吗?
      

  4.   

    和编码应该没有关系,我用
    textreader和textwriter,指定编码也不行
      

  5.   

    先在同样版本的操作系统和FRAMEWORK下进行测试,看包含中文时是否还会发生异常?http://msdn.microsoft.com/zh-cn/library/system.text.decoderfallbackexception(VS.95).aspxhttp://msdn.microsoft.com/zh-cn/library/302sbf78(v=VS.80).aspx
    使用BinaryRead 和BinaryWrite,并且指定编码时先尝试不要抛出异常看看若要启用错误检测并使类实例更加安全,请使用带有 throwOnInvalidBytes 参数的 UTF8Encoding 构造函数,并将该参数设置为 true。使用错误检测时,检测到无效字符序列或字节序列的方法将引发 ArgumentException。如果不使用错误检测,则不引发异常,并且通常会忽略无效序列。
      

  6.   

    楼主思路有问题。
    服务器端:
    首先,xml序列化的不对,应该把xml保存为文件。
      Dataset  ds=new Dataset();
         ...
      ds.WriteXml("xml路径.xml",XmlWriteMode.WriteSchema);
    第二,传送过程中不要用这种写法
     GZipStream gzipStream = new GZipStream(fs, CompressionMode.Decompress);//创建解压对象 
    直接用winrar软件的壳命令来压缩xml。然后通过socket传送到客户端。客户端:
    1。收到文件用winrar命令解压缩。保存xml文件到硬盘。
    2。  ds.ReadXml("xml保存路径.xml");
     
      
    我这种方法肯定可以,稳定性很高。
      

  7.   

    问题根源找到了,在server端。每次发送一个dataset时,先发序列化后的byte数,然后再发送
    数据,也就是会做两次socket.send,两次要是连续发送的话,就不稳定。象下面这样做就没问题了socket.send(size);
    thread.sleep(200);
    socket.send(data);
      

  8.   


    确实够稳定的,都TMD定到硬盘上去了,能不稳吗
      

  9.   

    LZ,我这边报出的错误是“无法将位于索引 95(索引值很随即) 处的字节 [FF](每次都是FF,每次) 由指定的代码页转换为 Unicode。”
    我是直接在内存里操作的MemoryStream。