C# DataSet對象序列化並壓縮

來源:互聯網
上載者:User

今天做一個項目中用到把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);
        }
    }
}

 

 

這裡先把序列化及壓縮的部分代碼貼出來,明天貼解壓及還原序列化的代碼。

 

是壓縮和沒壓縮的檔案大小對比,效果還明顯吧

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.