天天看點

C# dataset 壓縮,檔案壓縮

using System;

using System.Collections.Generic;

using System.IO.Compression;

using System.Text;

using System.Data;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using KCSvrOpr.Encrypt;

using System.Xml;

namespace KCSvrOpr.DataFormat

{

    /// <summary>

    /// 功    能:對資料的基本操作

    /// 作    者:BQONE

    /// 建立日期:2007年04月17日

    /// 更新作者:

    /// 更新日期:

    /// 添加功能:

    /// 描    述:包括資料的壓縮,對象與byte[]之間的轉換

    /// 版    權:HN KC

    /// </summary>

    public class KCDataFormatter

    {

        public KCDataFormatter() { }

        /// <summary>

        /// 将DataSet格式化成位元組數組byte[]

        /// </summary>

        /// <param name="dsOriginal">DataSet對象</param>

        /// <returns>位元組數組</returns>

        public static byte[] GetBinaryFormatData(DataSet dsOriginal)

        {

            byte[] binaryDataResult = null;

            MemoryStream memStream = new MemoryStream();

            IFormatter brFormatter = new BinaryFormatter();

            dsOriginal.RemotingFormat = SerializationFormat.Binary;

            brFormatter.Serialize(memStream, dsOriginal);

            binaryDataResult = memStream.ToArray();

            memStream.Close();

            memStream.Dispose();

            return binaryDataResult;

        }

        /// <summary>

        /// 将DataSet格式化成位元組數組byte[],并且已經經過壓縮

        /// </summary>

        /// <param name="dsOriginal">DataSet對象</param>

        /// <returns>位元組數組</returns>

        public static byte[] GetBinaryFormatDataCompress(DataSet dsOriginal)

        {

            byte[] binaryDataResult = null;

            MemoryStream memStream = new MemoryStream();

            IFormatter brFormatter = new BinaryFormatter();

            dsOriginal.RemotingFormat = SerializationFormat.Binary;

            brFormatter.Serialize(memStream, dsOriginal);

            binaryDataResult = memStream.ToArray();

            memStream.Close();

            memStream.Dispose();

            return Compress(binaryDataResult);

        }

        /// <summary>

        /// 解壓資料

        /// </summary>

        /// <param name="data"></param>

        /// <returns></returns>

        public static byte[] Decompress(byte[] data)

        {

            byte[] bData;

            MemoryStream ms = new MemoryStream();

            ms.Write(data, 0, data.Length);

            ms.Position = 0;

            GZipStream stream = new GZipStream(ms, CompressionMode.Decompress, true);

            byte[] buffer = new byte[1024];

            MemoryStream temp = new MemoryStream();

            int read = stream.Read(buffer, 0, buffer.Length);

            while (read > 0)

            {

                temp.Write(buffer, 0, read);

                read = stream.Read(buffer, 0, buffer.Length);

            }

            //必須把stream流關閉才能傳回ms流資料,不然資料會不完整

            stream.Close();

            stream.Dispose();

            ms.Close();

            ms.Dispose();

            bData = temp.ToArray();

            temp.Close();

            temp.Dispose();

            return bData;

        }

        /// <summary>

        /// 壓縮資料

        /// </summary>

        /// <param name="data"></param>

        /// <returns></returns>

        public static byte[] Compress(byte[] data)

        {

            byte[] bData;

            MemoryStream ms = new MemoryStream();

            GZipStream stream = new GZipStream(ms, CompressionMode.Compress, true);

            stream.Write(data, 0, data.Length);

            stream.Close();

            stream.Dispose();

            //必須把stream流關閉才能傳回ms流資料,不然資料會不完整

            //并且解壓縮方法stream.Read(buffer, 0, buffer.Length)時會傳回0

            bData = ms.ToArray();

            ms.Close();

            ms.Dispose();

            return bData;

        }

        /// <summary>

        /// 将位元組數組反序列化成DataSet對象

        /// </summary>

        /// <param name="binaryData">位元組數組</param>

        /// <returns>DataSet對象</returns>

        public static DataSet RetrieveDataSet(byte[] binaryData)

        {

            DataSet dsOriginal = null;

            MemoryStream memStream = new MemoryStream(binaryData);

            IFormatter brFormatter = new BinaryFormatter();

            Object obj = brFormatter.Deserialize(memStream);

            dsOriginal = (DataSet)obj;

            return dsOriginal;

        }

        /// <summary>

        /// 将位元組數組反解壓後序列化成DataSet對象

        /// </summary>

        /// <param name="binaryData">位元組數組</param>

        /// <returns>DataSet對象</returns>

        public static DataSet RetrieveDataSetDecompress(byte[] binaryData)

        {

            DataSet dsOriginal = null;

            MemoryStream memStream = new MemoryStream(Decompress(binaryData));

            IFormatter brFormatter = new BinaryFormatter();

            Object obj = brFormatter.Deserialize(memStream);

            dsOriginal = (DataSet)obj;

            return dsOriginal;

        }

        /// <summary>

        /// 将object格式化成位元組數組byte[]

        /// </summary>

        /// <param name="dsOriginal">object對象</param>

        /// <returns>位元組數組</returns>

        public static byte[] GetBinaryFormatData(object dsOriginal)

        {

            byte[] binaryDataResult = null;

            MemoryStream memStream = new MemoryStream();

            IFormatter brFormatter = new BinaryFormatter();

            brFormatter.Serialize(memStream, dsOriginal);

            binaryDataResult = memStream.ToArray();

            memStream.Close();

            memStream.Dispose();

            return binaryDataResult;

        }

        /// <summary>

        /// 将objec格式化成位元組數組byte[],并壓縮

        /// </summary>

        /// <param name="dsOriginal">object對象</param>

        /// <returns>位元組數組</returns>

        public static byte[] GetBinaryFormatDataCompress(object dsOriginal)

        {

            byte[] binaryDataResult = null;

            MemoryStream memStream = new MemoryStream();

            IFormatter brFormatter = new BinaryFormatter();

            brFormatter.Serialize(memStream, dsOriginal);

            binaryDataResult = memStream.ToArray();

            memStream.Close();

            memStream.Dispose();

            return Compress(binaryDataResult);

        }

        /// <summary>

        /// 将位元組數組反序列化成object對象

        /// </summary>

        /// <param name="binaryData">位元組數組</param>

        /// <returns>object對象</returns>

        public static object RetrieveObject(byte[] binaryData)

        {

            MemoryStream memStream = new MemoryStream(binaryData);

            IFormatter brFormatter = new BinaryFormatter();

            Object obj = brFormatter.Deserialize(memStream);

            return obj;

        }

        /// <summary>

        /// 将位元組數組解壓後反序列化成object對象

        /// </summary>

        /// <param name="binaryData">位元組數組</param>

        /// <returns>object對象</returns>

        public static object RetrieveObjectDecompress(byte[] binaryData)

        {

            MemoryStream memStream = new MemoryStream(Decompress(binaryData));

            IFormatter brFormatter = new BinaryFormatter();

            Object obj = brFormatter.Deserialize(memStream);

            return obj;

        }

        /// <summary>

        /// 解密配置檔案并讀入到xmldoc中

        /// </summary>

        public static XmlNode DecryptConfigFile(string filePath)

        {

            FileStream fs = new FileStream(filePath, FileMode.Open);

            XmlDocument m_XmlDoc = new XmlDocument();

            BinaryFormatter formatter = null;

            try

            {

                formatter = new BinaryFormatter();

                // Deserialize the hashtable from the file and//   assign   the   reference   to   the   local   variable.

                m_XmlDoc.LoadXml(KCEncrypt.Decrypt((string)formatter.Deserialize(fs)));

                return m_XmlDoc.DocumentElement;

            }

            catch (SerializationException e)

            {

                Console.WriteLine("Failed   to   deserialize.   Reason:   " + e.Message);

                throw;

            }

            finally

            {

                fs.Close();

                fs = null;

            }

        }

        /// <summary>

        /// 加密密鑰後再對檔案字元進行加密

        /// </summary>

        public static void EncryptConfigFile(string filePath, string str)

        {

            FileStream fs = new FileStream(filePath, FileMode.Create);

            BinaryFormatter formatter = new BinaryFormatter();

            try

            {

                formatter.Serialize(fs, KCEncrypt.Encrypt(str));

            }

            catch (SerializationException e)

            {

                Console.WriteLine("Failed   to   serialize.   Reason:   " + e.Message);

                throw;

            }

            finally

            {

                fs.Close();

                fs = null;

            }

        }

    }

}

------------------------------------------------------------------------------------------------------------------------------------

C# DataSet對象序列化并壓縮、反序列化并壓縮 2010-03-19 15:08

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);

        }

    }

}

/// <summary>

/// 反序列化壓縮的DataSet

/// </summary>

/// <param name="_filePath"></param>

/// <returns></returns>

static DataSet DataSetDeserializeDecompress(string _filePath)

{

    FileStream fs = File.OpenRead(_filePath);//打開檔案

    fs.Position = 0;//設定檔案流的位置

    GZipStream gzipStream = new GZipStream(fs, CompressionMode.Decompress);//建立解壓對象

    byte[] buffer = new byte[4096];//定義資料緩沖

    int offset = 0;//定義讀取位置

    MemoryStream ms = new MemoryStream();//定義記憶體流

    while ((offset = gzipStream.Read(buffer, 0, buffer.Length)) != 0)

    {

        ms.Write(buffer, 0, offset);//解壓後的資料寫入記憶體流

    }

    BinaryFormatter sfFormatter = new BinaryFormatter();//定義BinaryFormatter以反序列化DataSet對象

    ms.Position = 0;//設定記憶體流的位置

    DataSet ds;

    try

    {

        ds = (DataSet)sfFormatter.Deserialize(ms);//反序列化

    }

    catch

    {

        throw;

    }

    finally

    {

        ms.Close();//關閉記憶體流

        ms.Dispose();//釋放資源

    }

    fs.Close();//關閉檔案流

    fs.Dispose();//釋放資源

    gzipStream.Close();//關閉解壓縮流

    gzipStream.Dispose();//釋放資源

    return ds;

}

/// <summary>

/// 反序列化未壓縮的DataSet

/// </summary>

/// <param name="_filePath"></param>

/// <returns></returns>

static DataSet DataSetDeserialize(string _filePath)

{

    FileStream fs = File.OpenRead(_filePath);//打開檔案

    fs.Position = 0;//設定檔案流的位置

    BinaryFormatter sfFormatter = new BinaryFormatter();//定義BinaryFormatter以反序列化DataSet對象

    DataSet ds;

    try

    {

        ds = (DataSet)sfFormatter.Deserialize(fs);//反序列化

    }

    catch

    {

        throw;

    }

    finally

    {

        fs.Close();//關閉記憶體流

        fs.Dispose();//釋放資源

    }

    fs.Close();//關閉檔案流

    fs.Dispose();//釋放資源

    return ds;

}

----------------------------------------------------------------------

C# DataSet對象解壓縮及反序列化 收藏

昨天說了DataSet的序列化及壓縮,今天把解壓縮及反序列化的代碼寫一下:

view plain copy to clipboard print ?

  1. /// <summary>   
  2. /// 反序列化壓縮的DataSet   
  3. /// </summary>   
  4. /// <param name="_filePath"></param>   
  5. /// <returns></returns>   
  6. static DataSet DataSetDeserializeDecompress(string _filePath)   
  7. {   
  8.     FileStream fs = File.OpenRead(_filePath);//打開檔案   
  9.     fs.Position = 0;//設定檔案流的位置   
  10.     GZipStream gzipStream = new GZipStream(fs, CompressionMode.Decompress);//建立解壓對象   
  11.     byte[] buffer = new byte[4096];//定義資料緩沖   
  12.     int offset = 0;//定義讀取位置   
  13.     MemoryStream ms = new MemoryStream();//定義記憶體流   
  14.     while ((offset = gzipStream.Read(buffer, 0, buffer.Length)) != 0)   
  15.     {   
  16.         ms.Write(buffer, 0, offset);//解壓後的資料寫入記憶體流   
  17.     }   
  18.     BinaryFormatter sfFormatter = new BinaryFormatter();//定義BinaryFormatter以反序列化DataSet對象   
  19.     ms.Position = 0;//設定記憶體流的位置   
  20.     DataSet ds;   
  21.     try  
  22.     {   
  23.         ds = (DataSet)sfFormatter.Deserialize(ms);//反序列化   
  24.     }   
  25.     catch  
  26.     {   
  27.         throw;   
  28.     }   
  29.     finally  
  30.     {   
  31.         ms.Close();//關閉記憶體流   
  32.         ms.Dispose();//釋放資源   
  33.     }   
  34.     fs.Close();//關閉檔案流   
  35.     fs.Dispose();//釋放資源   
  36.     gzipStream.Close();//關閉解壓縮流   
  37.     gzipStream.Dispose();//釋放資源   
  38.     return ds;   
  39. }   
  40. /// <summary>   
  41. /// 反序列化未壓縮的DataSet   
  42. /// </summary>   
  43. /// <param name="_filePath"></param>   
  44. /// <returns></returns>   
  45. static DataSet DataSetDeserialize(string _filePath)   
  46. {   
  47.     FileStream fs = File.OpenRead(_filePath);//打開檔案   
  48.     fs.Position = 0;//設定檔案流的位置   
  49.     BinaryFormatter sfFormatter = new BinaryFormatter();//定義BinaryFormatter以反序列化DataSet對象   
  50.     DataSet ds;   
  51.     try  
  52.     {   
  53.         ds = (DataSet)sfFormatter.Deserialize(fs);//反序列化   
  54.     }   
  55.     catch  
  56.     {   
  57.         throw;   
  58.     }   
  59.     finally  
  60.     {   
  61.         fs.Close();//關閉記憶體流   
  62.         fs.Dispose();//釋放資源   
  63.     }   
  64.     fs.Close();//關閉檔案流   
  65.     fs.Dispose();//釋放資源   
  66.     return ds;   
  67. }