无问的BLOG

博客园 首页 新随笔 联系 订阅 管理

今天做一个项目中用到把DataSet对象序列化成文件,并上传到服务器,不过生成的文件比较大,就想着压缩一下,找了一下资料,用GZipStream来压缩了一下,效果还是非常理想的。现在把这部分代码整理了一下:

 

using System.Data;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace DataSetSerializerDeserialize
{
    
class Program
    {
        
/// <summary>
        
/// 序列化DataSet对象并压缩
        
/// </summary>
        
/// <param name="ds"></param>
        static void DataSetSerializerCompression(DataSet ds)
        {
            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("datasetCompression.dat");//创建文件

            GZipStream gzipStream 
= new GZipStream(fs, CompressionMode.Compress, true);//创建压缩对象

            gzipStream.Write(buffer, 
0, buffer.Length);//把压缩后的数据写入文件

            gzipStream.Close();//关闭压缩流,这里要注意:一定要关闭,要不然解压缩的时候会出现小于4K的文件读取不到数据,大于4K的文件读取不完整           

            gzipStream.Dispose();//释放对象

            fs.Close();//关闭流

            fs.Dispose();
//释放对象
        }

        
/// <summary>
        
/// 不压缩直接序列化DataSet
        
/// </summary>
        
/// <param name="ds"></param>
        static void DataSetSerializer(DataSet ds)
        {
            IFormatter formatter 
= new BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象

            FileStream fs 
= File.Create("dataset.dat");//创建文件

            formatter.Serialize(fs, ds);
//把DataSet对象序列化到文件

            fs.Close();
//关闭流

            fs.Dispose();
//释放对象
        }

        
static void Main(string[] args)
        {
            DataTable table 
= new DataTable("ParentTable");
            
            DataColumn column;
            DataRow row;

            column 
= new DataColumn();
            column.DataType 
= System.Type.GetType("System.Int32");
            column.ColumnName 
= "id";
            column.ReadOnly 
= true;
            column.Unique 
= true;
            table.Columns.Add(column);

            column 
= new DataColumn();
            column.DataType 
= System.Type.GetType("System.String");
            column.ColumnName 
= "ParentItem";
            column.AutoIncrement 
= false;
            column.Caption 
= "ParentItem";
            column.ReadOnly 
= false;
            column.Unique 
= false;
            table.Columns.Add(column);

            DataColumn[] PrimaryKeyColumns 
= new DataColumn[1];
            PrimaryKeyColumns[
0= table.Columns["id"];
            table.PrimaryKey 
= PrimaryKeyColumns;

            DataSet dataSet 
= new DataSet();
            dataSet.Tables.Add(table);

            
for (int i = 0; i <= 100; i++)
            {
                row 
= table.NewRow();
                row[
"id"= i;
                row[
"ParentItem"= "ParentItem " + i;
                table.Rows.Add(row);
            }
            DataSetSerializer(dataSet);
            DataSetSerializerCompression(dataSet);
        }
    }
}

 

 

这里先把序列化及压缩的部分代码贴出来,明天贴解压及反序列化的代码。

 

下图是压缩和没压缩的文件大小对比,效果还明显吧

posted on 2009-03-24 21:58  东子  阅读(4610)  评论(11编辑  收藏