转载 C# 序列化与反序列化意义详解

C# 序列化与反序列化意义详解

总结:

①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中
②序列化以某种存储形式使自定义对象持久化; 
③将对象从一个地方传递到另一个地方。 
④将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。 
⑥序列是指将对象的实例状态存储到存储媒体的过程。 
在此过程中,先将对象的公共字段以及类的名称(包括类的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
⑦用处非常大,用于数据传输,对象存贮等。

这些是我通过网上多方参考再结合自己的经验总结的。还是看实例。

【实例1】:

using System;

using System.IO; //文件操作相关
using System.Runtime.Serialization.Formatters.Binary; //包含 BinaryFormatter 类,该类可用于以二进制格式将对象序列化和反序列化。

namespace SerializeDeserialize
{
    class Program
    {
        static void Main(string[] args)
        {
            Program P = new Program();
            P.SerializeStudent();
            P.DeSerializeStudent();
        }
        public void SerializeStudent()
        {
            Student c = new Student();
            c.Id = 0;
            c.Name = "小江";
            c.Sex = "女";
            c.Qq = "676596050";
            c.Homepage = "http://hi.baidu.com/jiang_yy_jiang";
            //创建二进制文件temp.dat
            FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Create);
            BinaryFormatter b = new BinaryFormatter();

//将Student实例对象序列化给fileStream流:其含义是这时候的Student对象已经存储到temp.dat 文件中
            b.Serialize(fileStream, c);
            fileStream.Flush();
            fileStream.Close();
            fileStream.Dispose();
        }
        public void DeSerializeStudent()
        {

Student c = new Student();
            //下面三个属性输出时没有更改,因为反序列化实例化了一个新的Student
            c.Id = 1;
            c.Qq = "676596051";
            c.Homepage = "http://www.baidu.com/jiang_yy_jiang";
            FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryFormatter b = new BinaryFormatter();
            //将temp.dat 的文件流反序列化为Student
            c = b.Deserialize(fileStream) as Student;
            c.Name = "江正";
            c.Sex = "男";
            Console.Write("编号:" + c.Id + "\n姓名:" + c.Name + "\n性别:" + c.Sex + "\nQQ:" + c.Qq + "\n主页:" + c.Homepage);
            Console.ReadLine();
            //释放文件流资源
            fileStream.Flush();
            fileStream.Close();
            fileStream.Dispose();
        }

/// <summary>
        /// 创建6个可读可写的属性
        /// </summary>
        [Serializable]
        public class Student
        {
            //编号
            private int id;
            //姓名
            private string name;
            //性别
            private string sex;
            //QQ
            private string qq;
            //主页
            private string homepage;

public int Id
            {
                get { return id; }
                set { id = value; }
            }
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public string Sex
            {
                get { return sex; }
                set { sex = value; }
            }
            public string Qq
            {
                get { return qq; }
                set { qq = value; }
            }
            public string Homepage
            {
                get { return homepage; }
                set { homepage = value; }
            }

}

}
}

上面的序列化会将Student类实例存储到temp.dat 文件中,相反的反序列化就会实现将temp.dat中的数据反向生成Student对象

方便理解,其中在本实例中C:\temp.dat内容是:

KSerializeDeserialize, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null    $SerializeDeserialize.Program+Student    id name sex qq           灏忔睙    濂?    676596050

可以看出已经转换为了二进制编码。

效果是:

【实例2】:

using System;

using System.Collections; //HashTable 所在的命名空间
using System.IO;           //FileStream所在的命名空间
using System.Runtime.Serialization.Formatters.Binary; //序列化反序列化进制转换空间

namespace Same1
{
    class Program
    {
        static void Main(string[] args)
        {
            Serialize();
            Deserialize();
            Console.ReadLine();
        }
        static void Serialize()
        {
            //创建一个包含值的HashTable最后将被序列化
            Hashtable addresses = new Hashtable();
            addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
            addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
            addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
            //为了将HashTable序列化,需要创建一个File Stream
            FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
            // 利用二进制格式化将 Hashtable序列化至文件流中
            BinaryFormatter formatter = new BinaryFormatter();
            try
            {
                formatter.Serialize(fs, addresses);
            }
            catch (System.Runtime.Serialization.SerializationException e)
            {
                Console.WriteLine("序列化失败原因是: " + e.Message);
                throw;
            }
            finally
            {
                fs.Flush();
                fs.Close();
                fs.Dispose();
            }
        }
        static void Deserialize()
        {
            // 声明一个HashTable
            Hashtable addresses = null;
            // 打开你需要反序列化的文件,并以流的形式输出
            FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
            try
            {
                BinaryFormatter formatter = new BinaryFormatter();
                //反序列化文件流为HashTable
                addresses = (Hashtable)formatter.Deserialize(fs);
            }
            catch (System.Runtime.Serialization.SerializationException e)
            {
                Console.WriteLine("反序列化失败,原因是: " + e.Message);
                throw;
            }
            finally
            {
                fs.Flush();
                fs.Close();
                fs.Dispose();
            }
            //为了验证反序列化是否成功,将HashTale中的键、值对输出
            foreach (DictionaryEntry de in addresses)
            {
                Console.WriteLine("{0} 的出生地是: {1}.", de.Key, de.Value);
            }
        }
    }
}

DateFile.dat 内容是:

System.Collections.Hashtable    
LoadFactor Version Comparer HashCodeProvider HashSize Keys Values System.Collections.IComparer$System.Collections.IHashCodeProvider 霶8?

Mary    Jeff    Fred          "PO Box 112233, Palo Alto, CA 94301    "123 Main Street, Redmond, WA 98052     987 Pine Road, Phila., PA 19116

效果如下:

时间: 2025-01-14 14:58:47

转载 C# 序列化与反序列化意义详解的相关文章

TOP命令各个参数代表意义详解

TOP命令各个参数代表意义详解 Top命令是Linux下常用的系统性能分析工具,能实时查看系统中各个进程资源占用情况. 第一行分别显示: 当前时间.系统启动时间.当前系统登录用户数目.平均负载(1分钟,10分钟,15分钟). 平均负载(load average),一般对于单个cpu来说,负载在0-1.00之间是正常的,超过1.00须引起注意.在多核cpu中,系统平均负载不应该高于cpu核心的总数. 第二行分别显示: 进程总数.运行进程数.休眠进程数.终止进程数.僵死进程数. 第三行: %us用户

【转载】html中object标签详解

[转载自http://blog.csdn.net/soliy/archive/2010/03/22/5404183.aspx] html标签之Object标签详解 作者:网络    出处:网络    2010年3月22日13:36:29 定义和用法定义一个嵌入的对象.请使用此元素向您的 XHTML 页面添加多媒体.此元素允许您规定插入 HTML 文档中的对象的数据和参数,以及可用来显示和操作数据的代码.<object> 标签用于包含对象,比如图像.音频.视频.Java applets.Acti

【转载】va_start和va_end使用详解

本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解. 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...); 这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会

【转载】序列化和反序列化

#摘要序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中:另一方面,它们会以其他更容易理解的概念出现,例如加密.持久化.然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.恰当的序列化协议不仅可以提高系统的通用性.强健性.安全性.优化系统性能,而且会让系统更加易于调试.便于扩展.本文从多个角度去分析和讲解"序列化和反序列化",并对比了当前流行的几种序列

转载的 Linux下chkconfig命令详解

Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] chkconfig 在没有参数运行时,显示用法.如果加上服务名,那么就检查这个服务是否在当前运行级启动.如果是

【转载】SQL注入攻防入门详解

滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长统计|  今日IP[353] | 今日PV[848] | 昨日IP[922] |  昨日PV[2188] |当前在线[10] SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但

【转载】 Eclipse注释模板设置详解

 Eclipse注释模板设置详解 网站推荐: 金丝燕网(主要内容是 Java 相关) 木秀林网(主要内容是消息队列)

(转载)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

C++内存分配方式详解--堆.栈.自由存储区.全局/静态存储区和常量存储区       栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结

转载:SqlServer数据库性能优化详解

本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量.为达到此目的,需要了解应用程序的需求和数据的逻辑和物理结构,并在相互冲突的数据库使用之间(如联机事务处理 (OLTP) 与决策支持)权衡. 对性能问题的考虑应贯穿于开发阶段的全过程,不应只在最后实现系统时才考虑性能问题.许多使性能得