您的位置:首页 > 编程语言 > C#

C# DataSet对象序列化并压缩

2009-03-24 21:58 351 查看
今天做一个项目中用到把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);

}

}

}

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: