首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# DataSet 序列化並以 GZipStream 壓縮實作

     編輯:關於C語言

需求背景

專案需將 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 檔案讀取不完整。

壓縮效果示意

壓縮前後檔案大小比較

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved