C# 中对DataSet进行压缩

下面的方法中用到了DataSetSurrogate (附录中带了源码)

1、调用 DataSetSurrogate对数据集进行序列化操作,生成二进制数组

 public byte[] getSerializeDataSet(DataSet dt)

        {

            DataSetSurrogate dss = new DataSetSurrogate(dt);

            BinaryFormatter ser = new BinaryFormatter();

            MemoryStream ms = new MemoryStream();

            ser.Serialize(ms, dss);

            byte[] buffer = ms.ToArray();

            return buffer;

        }

2 对二进制数组进行压缩,得到压缩后的二进制数组

       public byte[] Compress(byte[] data)//压缩

        {

            MemoryStream ms = new MemoryStream();

            Stream zipStream = null;

            zipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true);

            //System.IO.Compression.CompressionMode:指定是否压缩和解压缩基础流(Compress:压缩,DeCompress:解压缩)

            zipStream.Write(data, 0, data.Length);

            zipStream.Close();

            ms.Position = 0;//获取或设置流中当前位置

            byte[] compressed_data = new byte[ms.Length];

            ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));

            return compressed_data;

        }

3、压缩后的DATASET就生成了

4、下面为如何解压缩得到DATASET

        public byte[] Decompress(byte[] data)//解压缩

        {

            try

            {

                MemoryStream ms = new MemoryStream(data);

                Stream zipStream = null;

                zipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress);

                byte[] dc_data = null;

                dc_data = EtractBytesFormStream(zipStream, data.Length);

                return dc_data;

            }

            catch

            {

                return null;

            }

        }

        public byte[] EtractBytesFormStream(Stream zipStream, int dataBlock)

        {

            try

            {

                byte[] data = null;

                int totalBytesRead = 0;

                while (true)

                {

                    Array.Resize(ref data, totalBytesRead + dataBlock + 1);

                    int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);

                    if (bytesRead == 0)

                    {

                        break;

                    }

                    totalBytesRead += bytesRead;

                }

                Array.Resize(ref data, totalBytesRead);

                return data;

            }

            catch

            {

                return null;

            }

        }

5、通过DataSetSurrogate得到解压后的DATASET

        public DataSet ReSerializable(byte[] buffer)

        {

            BinaryFormatter ser = new BinaryFormatter();

            DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;

            DataSet dataSet = dss.ConvertToDataSet();

            return dataSet;

        }

DAtaSetSurrogate原码
posted @ 2009-02-25 14:52  丁守庆  阅读(550)  评论(0编辑  收藏  举报
专业成就价值