今天做一個項目中用到把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);
}
}
}
這裡先把序列化及壓縮的部分代碼貼出來,明天貼解壓及還原序列化的代碼。
是壓縮和沒壓縮的檔案大小對比,效果還明顯吧