今天做一個項目中用到把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);
}
}
}
這裡先把序列化及壓縮的部分代碼貼出來,明天貼解壓及反序列化的代碼。