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

效果如下:

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

  1. Java反序列化漏洞详解

      Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...

  2. 【META http-equiv="Content-Type" Content="text/html; Charset=*】意义详解

    [META http-equiv="Content-Type" Content="text/html; Charset=*]意义详解 META,网页Html语言里Head ...

  3. [转载]Java序列化与反序列化

    [转载]Java序列化与反序列化 来源: https://www.cnblogs.com/anitinaj/p/9253921.html 序列化和反序列化作为Java里一个较为基础的知识点,那你能说一 ...

  4. 【转载】html中object标签详解

    [转载自http://blog.csdn.net/soliy/archive/2010/03/22/5404183.aspx] html标签之Object标签详解 作者:网络    出处:网络     ...

  5. 【转载】KMP入门级别算法详解--终于解决了(next数组详解)

    [转载]https://blog.csdn.net/LEE18254290736/article/details/77278769 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O ...

  6. 转载 LayoutInflater的inflate函数用法详解

    http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...

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

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

  8. 【转载整理】mysql权限分配详解

    原文:https://www.cnblogs.com/Csir/p/7889953.html MySQL权限级别 1)全局性的管理权限,作用于整个MySQL实例级别 2)数据库级别的权限,作用于某个指 ...

  9. [转载]springmvc学习之@ModelAttribute运用详解

    spring学习之@ModelAttribute运用详解 链接

随机推荐

  1. KEIL MDK环境下uCOS-II在LPC17xx上的移植实例

    1. 知识准备 要想对ucos-ii的移植有较深的理解,需要两方面知识: (1)目标芯片,这里是lpc17xx系列芯片,它们都是基于ARMv7 Cortex-M3内核,所以这一类芯片的ucos-ii移 ...

  2. Android Monkey Test

    Monkey测试是Android自动化测试的一种手段,Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常.当Monkey程序在模拟器或设备运行的时候, ...

  3. Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答

    Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答 Boost正则表达式库regex常用search和match示例 发表回复   Boo ...

  4. android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds差别

    手工设置文本与图片相对位置时.经常使用到例如以下方法: setCompoundDrawables(left, top, right, bottom) setCompoundDrawablesWithI ...

  5. 依赖注入及AOP简述(十三)——AOP应用举例(完结) .

    2.     AOP应用举例 在一般的应用程序开发中,有一些典型的AOP应用,使得开发者可以专注于业务逻辑本身,而不是与之完全无关的一些“方面”. l        首先就是关于前面介绍过的日志输出类 ...

  6. POJ2528线段树基础

    開始就直接用延迟标记搞了下.最后发现内存肯定会爆了.数据太大了. 问了瓜神,原来应该用离散化来做这题,详细见凝视 #include <cstdio> #include <cstrin ...

  7. 【POJ 1125】Stockbroker Grapevine

    id=1125">[POJ 1125]Stockbroker Grapevine 最短路 只是这题数据非常水. . 主要想大牛们试试南阳OJ同题 链接例如以下: http://acm. ...

  8. C语言-进制

    本文目录 • 一.十进制 • 二.二进制 • 三.八进制 • 四.十六进制 • 五.进制总结 • 六.变量与进制 • 七.printf的简单使用上一讲简单介绍了常量和变量,这讲补充一点计算机的基础知识 ...

  9. hdu3516

    题目大意:这个....翻译起来还真是不好说,各位四六没过的ACMer正好去原网页看看题意,过了的好孩子还是去看看原网页看看锻炼一下吧.(当然我做这道题目的时候,教练已经摆明说要用四边形不等式,所以还是 ...

  10. Js把URL中的参数解析为一个对象

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title&g ...