C# DataSet对象序列化并压缩

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

这里先把序列化及压缩的部分代码贴出来,明天贴解压及反序列化的代码。

时间: 2024-10-30 08:31:30

C# DataSet对象序列化并压缩的相关文章

关于对象序列化后,所占数据变大,怎么解决?

问题描述 程序描述:我需要序列化一批对象,为什么序列化后的对象比实际上在内存中的对象占的字节要大,如果我要保持序列化后的对象所占的字节数和对象在内存中所占的字节数一样的化(未序列化之前),我需要怎么调整序列化?///要序列化的类:[Serializable]publicclassMyObject{publicintN1{get;set;}}//序列化50组类,一次递增(第一次,序列化一个,第二次两个,依次递增)for(intj=1;j<=50;j++){List<MyObject>lis

C#对象序列化和反序列化

C#对象序列化和反序列化,如下代码示例: using System;  using System.Text;  using System.Collections.Generic;  using System.IO;  using System.Runtime.Serialization.Formatters.Binary;    class SerializableOperate  {      private static void ObjectSerializable(object obj,

对象序列化反序列化例子

using System; using System.IO; using System.Xml.Serialization; [Serializable] public class Model { public string Name{get;set;} public string Possword{get;set;} public override string ToString() { return "Name:"+ Name+"possword:"+Possw

Ajax 的 Java 对象序列化

ajax|对象 如果您正在使用异步 JavaScript 和 XML(Ajax)进行 Java Web 开发,那么您最关心的问题可能就是把数据从服务器传递给客户机.在面向 Java 开发人员的 Ajax 系列的文章中,Philip McCarthy 介绍了 Java 对象序列化的五种方式,并提供了选择最适合应用程序的数据格式和技术所需要的全部信息.本文将侧重于许多 Java Web 开发人员最关心的问题:为客户机生成数据. 多数 Java 开发人员已经把模型-视图-控制器(MVC)模式应用在他们

Ajax 的 Java 对象序列化(1)

ajax|对象 如果您正在使用异步 JavaScript 和 XML(Ajax)进行 Java Web 开发,那么您最关心的问题可能就是把数据从服务器传递给客户机. 在面向 Java 开发人员的 Ajax 系列的文章中,Philip McCarthy 介绍了 Java 对象序列化的五种方式,并提供了选择最适合应用程序的数据格式和技术所需要的全部信息.本文将侧重于许多 Java Web 开发人员最关心的问题:为客户机生成数据. 多数 Java 开发人员已经把模型-视图-控制器(MVC)模式应用在他

JAVA对象序列化保存为XML文件的工具类

java对象|xml   今天看了看java.beans包,发现了两个好东西,XMLEncoder和XMLDecoder.发现自己以前把从XML存取对象真是太费力气啦.做了小工具类,以后可以用用了. package com.imct.util; import java.beans.XMLDecoder;import java.beans.XMLEncoder;import java.io.File;import java.io.FileInputStream;import java.io.Fil

java对象序列化学习笔记

java对象|笔记 目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少.本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家.希望能为整个java社区的繁荣做一点事情.    序列化的过程就是对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网

ADO.NET读书笔记系列之------DataSet对象

ado|笔记|对象 一.特点介绍 1.处理脱机数据,在多层应用程序中很有用. 2.可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法. 3.处理分级数据 4.缓存更改 5.XML的完整性:DataSet对象和XML文档几乎是可互换的. 二.使用介绍 1.创建DataSet对象:DataSet ds = new DataSet("DataSetName"); 2.查看调用SqlDataAdapter.Fill创建的结构     da.Fill(ds,"Ord

.NET 中的对象序列化

对象 简介序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本. 在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡.只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行.例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化.以下各部分将探讨 .NET 框架提供