在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例常用C#方法 → DataSet序列化和反序列化以及压缩算法的例子

DataSet序列化和反序列化以及压缩算法的例子

常用C#方法

下载此实例
  • 开发语言:C#
  • 实例大小:0.08M
  • 下载次数:32
  • 浏览次数:409
  • 发布时间:2015-11-23
  • 实例类别:常用C#方法
  • 发 布 人:2643497416
  • 文件格式:.zip
  • 所需积分:1
 相关标签: DataSet 压缩 序列化 反序列化

实例介绍

【实例简介】

这是DataSet序列化和反序列化以及压缩算法的例子


【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO.Compression;

using DocumentFormat.OpenXml.Extensions;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;

namespace SerializationTest
{
	class Program
	{
		static void Main(string[] args)
		{
            string xlfile=@"C:\Users\Ralph\Documents\visual studio 2010\Projects\SerializationTest\data.xlsx";
            string datafile=@"C:\Users\Ralph\Documents\visual studio 2010\Projects\SerializationTest\data.dat";

            DataSet ds = new DataSet();
            ds.Tables.Add(OpenXMLExcelHelper.GetDataTable(xlfile,"Sheet1"));

            DataTable dt;
            dt = ds.Tables[0];

            BinaryDataSetSerializer.Serialize(ds, datafile);
            BinaryDataSetSerializer.ZipSerialize(ds, datafile   "z");

            //DataSet ds2 = BinaryDataSetSerializer.Deserialize(datafile);
            DataSet ds2 = BinaryDataSetSerializer.ZipDeserialize(datafile   "z");

            dt = ds2.Tables[0];

            foreach (DataRow row in dt.Rows)  
            {  
                //Console.WriteLine("/t");  
                foreach (DataColumn column in dt.Columns)  
                    Console.Write("\t{0}", row[column]);  
                Console.WriteLine("\t");  
            }  

            Console.ReadKey();
		}
    }

    public static class OpenXMLExcelHelper
    {
        public static DataTable GetDataTable(string excelFile, string sheetName)
        {
            using (var doc = SpreadsheetDocument.Open(excelFile, false))
            {
                WorkbookPart wbPart = doc.WorkbookPart;
                List<Sheet> sheets = wbPart.Workbook.Descendants<Sheet>().ToList();
                var iSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(c => c.Name == sheetName);
                WorksheetPart worksheetPart = (WorksheetPart)wbPart.GetPartById(iSheet.Id);

                if (iSheet != null)
                {
                    SharedStringTable stringTable = doc.WorkbookPart.SharedStringTablePart.SharedStringTable;
                    IEnumerable<Row> rows = worksheetPart.Worksheet.Descendants<Row>();
                    DataTable dt = new DataTable("Excel");
                    foreach (Row row in rows)
                    {
                        if (row.RowIndex == 1)
                        {
                            GetDataColumn(row, stringTable, ref dt);
                        }
                        GetDataRow(row, stringTable, ref dt);
                    }
                    return dt;
                }
                else
                {
                    return null;
                }
            }
        }

        /// <summary> 
        /// 构建DataTable的列         
        /// </summary>         
        /// <param name="row">OpenXML定义的Row对象</param>         
        /// <param name="stringTablePart"></param>         
        /// <param name="dt">需要返回的DataTable对象</param>         
        /// <returns></returns> 

        private static void GetDataColumn(Row row, SharedStringTable stringTable, ref DataTable dt)
        {
            DataColumn col = new DataColumn();
            foreach (Cell cell in row)
            {
                string cellVal = GetValue(cell, stringTable);
                col = new DataColumn(cellVal);
                dt.Columns.Add(col);
            }
        }

        /// <summary>         
        /// 构建DataTable的每一行数据,并返回该Datatable         
        /// </summary>         
        /// <param name="row">OpenXML的行</param>         
        /// <param name="stringTablePart"></param>         
        /// <param name="dt">DataTable</param>         
        private static void GetDataRow(Row row, SharedStringTable stringTable, ref DataTable dt)
        {
            // 读取算法:按行逐一读取单元格,如果整行均是空数据 
            // 则忽略改行(因为本人的工作内容不需要空行)-_- 
            DataRow dr = dt.NewRow();
            int i = 0;
            int nullRowCount = i;
            foreach (Cell cell in row)
            {
                string cellVal = GetValue(cell, stringTable);
                if (cellVal == string.Empty)
                {
                    nullRowCount  ;
                }
                dr[i] = cellVal;
                i  ;
            }

            if (nullRowCount != i)
            {
                dt.Rows.Add(dr);
            }

        }



        /// <summary> 
        /// 获取单元格的值 
        /// </summary> 
        /// <param name="cell"></param> 
        /// <param name="stringTablePart"></param> 
        /// <returns></returns> 
        public static string GetValue(Cell cell, SharedStringTable stringTable)
        {
            //由于Excel的数据存储在SharedStringTable中,需要获取数据在SharedStringTable 中的索引 
            string value = string.Empty;
            try
            {
                if (cell.ChildElements.Count == 0)
                    return value;
                value = double.Parse(cell.CellValue.InnerText).ToString();
                if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
                {
                    value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
                }
            }
            catch (Exception)
            {
                value = "N/A";
            }
            return value;
        }


    }

	public static class BinaryDataSetSerializer
	{
		/// <summary>
        /// 序列化DataSet对象并压缩
        /// </summary>
        /// <param name='ds'></param>
        public static bool ZipSerialize(DataSet ds, string filename)
        {
            bool _state = true;
            try
            {
                IFormatter formatter = new BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
                MemoryStream ms = new MemoryStream();//创建内存流对象
                formatter.Serialize(ms, ds);//把DataSet对象序列化到内存流
                byte[]buffer = ms.ToArray();//把内存流对象写入字节数组
                ms.Close();//关闭内存流对象
                ms.Dispose();//释放资源
                if(File.Exists(filename))
                    File.Delete(filename);
                Stream _Stream = File.Open(filename, FileMode.Create);//创建文件
                GZipStream gzipStream = new GZipStream(_Stream, CompressionMode.Compress, true);//创建压缩对象
                gzipStream.Write(buffer, 0, buffer.Length);//把压缩后的数据写入文件
                gzipStream.Close();//关闭压缩流,这里要注意:一定要关闭,要不然解压缩的时候会出现小于4K的文件读取不到数据,大于4K的文件读取不完整
                gzipStream.Dispose();//释放对象
                _Stream.Flush();//释放内存
                _Stream.Close();//关闭流
                _Stream.Dispose();//释放对象
            }
            catch (Exception ex)
            {
                _state = false;
            }
            return _state;
        }
        /// <summary>
        /// 不压缩直接序列化DataSet
        /// </summary>
        public static bool Serialize(DataSet ds, string filename)
        {
            bool _state = true;
            try
            {
                IFormatter formatter = new BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
                if (File.Exists(filename))
                    File.Delete(filename);
                Stream _Stream = File.Open(filename, FileMode.Create);//创建文件
                formatter.Serialize(_Stream, ds);//把DataSet对象序列化到文件
                _Stream.Flush();//释放内存
                _Stream.Close();//关闭流
                _Stream.Dispose();//释放对象
            }
            catch (Exception ex)
            {
                _state = false;
            }
            return _state;
        }
        /// <summary>
        /// 反序列化压缩的DataSet
        /// </summary>
        /// <returns></returns>
        public static DataSet ZipDeserialize(string datafile)
        {
            Stream _Stream = File.Open(datafile, FileMode.Open);//打开文件
            _Stream.Position = 0;//设置文件流的位置
            GZipStream gzipStream = new GZipStream(_Stream, 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);//解压后的数据写入内存流
            }
            IFormatter formatter = new BinaryFormatter();//定义BinaryFormatter以反序列化DataSet对象
            ms.Position = 0;//设置内存流的位置
            DataSet ds;
            try
            {
            ds = (DataSet)formatter.Deserialize(ms);//反序列化
            }
            catch
            {
            ds = null;
            }
            ms.Close();//关闭内存流
            ms.Dispose();//释放资源
            _Stream.Flush();//释放内存
            _Stream.Close();//关闭文件流
            _Stream.Dispose();//释放资源
            gzipStream.Close();//关闭解压缩流
            gzipStream.Dispose();//释放资源
            return ds;
        }
        /// <summary>
        /// 反序列化未压缩的DataSet
        /// </summary>
        /// <returns></returns>
        public static DataSet Deserialize(string datafile)
        {
            Stream _Stream = File.Open(datafile, FileMode.Open);//打开文件
            _Stream.Position = 0;//设置文件流的位置
            IFormatter formatter = new BinaryFormatter();//定义BinaryFormatter以反序列化DataSet对象
            DataSet ds;
            try
            {
            ds = (DataSet)formatter.Deserialize(_Stream);//反序列化
            }
            catch
            {
            ds = null;
            }
            _Stream.Flush();//释放内存
            _Stream.Close();//关闭文件流
            _Stream.Dispose();//释放资源
            return ds;
        }
     }
}
	


实例下载地址

DataSet序列化和反序列化以及压缩算法的例子

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 xcl981323 发表于: 2021-09-05 22:20 22
缺严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS0234 命名空间“DocumentFormat.OpenXml”中不存在类型或命名空间名“Spreadsheet”(是否缺少程序集引用?) SerializationTest D:\LgDoc\TestDemo\好例子网_DataSet序列化和反序列化以及压缩算法的例子\SerializationTest\SerializationTest\Program.cs 14 活动

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警