專案需將 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
{
/// 序列化 DataSet 並壓縮
static void DataSetSerializerCompression(DataSet ds)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
formatter.Serialize(ms, ds);
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();
}
/// 不壓縮直接序列化
static void DataSetSerializer(DataSet ds)
{
IFormatter formatter = new BinaryFormatter();
FileStream fs = File.Create("dataset.dat");
formatter.Serialize(fs, ds);
fs.Close(); fs.Dispose();
}
static void Main(string[] args)
{
DataTable table = new DataTable("ParentTable");
// ... 建立欄位、主鍵、資料列(略) ...
DataSet dataSet = new DataSet();
dataSet.Tables.Add(table);
for (int i = 0; i <= 100; i++) { /* 加入資料 */ }
DataSetSerializer(dataSet);
DataSetSerializerCompression(dataSet);
}
}
}
GZipStream.Close() 必須呼叫,否則解壓縮時小於 4KB 檔案無法讀取、大於 4KB 檔案讀取不完整。

明天將釋出解壓縮與反序列化程式碼。