序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件中“恢复”对象到序列化之前的状态。
在.net中有提供了几种序列化的方式:
二进制序列化
XML序列化
SOAP序列化

二进制序列化
所谓二进制序列化,指的是对象序列化之后是二进制形式的。二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。

XML序列化
所谓XML序列化,是指对象序列化之后的结果是XML形式的。保存XML序列化是通过XmlSerializer 类来实现的, 这个类位于System.Xml.Serialization命名空间下。

SOAP序列化
所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP协议传输(不知道SOAP协议?百度一下吧)。SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用。

下面编写一个类用于序列化和反序列化,这个类的代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace MySerializeDemo
  5. {
  6. [Serializable]
  7. /// <summary>
  8. /// 要序列化的对象
  9. /// 作者:周公
  10. /// 编写时间:2009-03-10
  11. /// </summary>
  12. public class MyObject
  13. {
  14. //[NonSerialized]
  15. private string name;
  16. private DateTime birthday;
  17. private string homePlace;
  18. /// <summary>
  19. /// 出生地
  20. /// </summary>
  21. public string HomePlace
  22. {
  23. get { return homePlace; }
  24. set { homePlace = value; }
  25. }
  26. /// <summary>
  27. /// 生日
  28. /// </summary>
  29. public DateTime Birthday
  30. {
  31. get { return birthday; }
  32. set { birthday = value; }
  33. }
  34. /// <summary>
  35. /// 姓名
  36. /// </summary>
  37. public string Name
  38. {
  39. get { return name; }
  40. set { name = value; }
  41. }
  42. /// <summary>
  43. /// 年龄
  44. /// </summary>
  45. public int Age
  46. {
  47. get { return DateTime.Now.Year - birthday.Year; }
  48. }
  49. /// <summary>
  50. /// override了ToString()方法
  51. /// </summary>
  52. /// <returns></returns>
  53. public override string ToString()
  54. {
  55. return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homePlace,Age);
  56. }
  57. }
  58. }

下面是分别用上面的三个类进行序列化和反序列化的代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Runtime.Serialization.Formatters;
  6. using System.Runtime.Serialization.Formatters.Binary;
  7. using System.Runtime.Serialization.Formatters.Soap;
  8. using System.Xml.Serialization;
  9. namespace MySerializeDemo
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. MyObject obj = new MyObject();
  16. obj.Birthday = new DateTime(1979, 11, 7);
  17. obj.HomePlace = "湖北";
  18. obj.Name = "周公";
  19. Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。====");
  20. BinarySerialize(obj);
  21. BinaryDeserialize("C://MyObject.dat");
  22. Console.WriteLine("========使用SoapFormatter类进行序列化和反序列化。====");
  23. SOAPSerialize(obj);
  24. SOAPDeserialize("C://MyObject.soap");
  25. Console.WriteLine("========使用XmlSerializer类进行序列化和反序列化。====");
  26. XMLSerialize(obj);
  27. XMLDeserialize("C://MyObject.xml");
  28. }
  29. /// <summary>
  30. /// 二进制序列化对象
  31. /// </summary>
  32. /// <param name="obj"></param>
  33. public static void BinarySerialize(MyObject obj)
  34. {
  35. using (FileStream stream = new FileStream("C://MyObject.dat", FileMode.Create, FileAccess.Write))
  36. {
  37. BinaryFormatter formater = new BinaryFormatter();
  38. formater.Serialize(stream, obj);
  39. Console.WriteLine("对象已经被序列化。" + obj.ToString());
  40. }
  41. }
  42. /// <summary>
  43. /// 二进制反序列化
  44. /// </summary>
  45. /// <param name="fileName"></param>
  46. public static void BinaryDeserialize(string fileName)
  47. {
  48. using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  49. {
  50. BinaryFormatter formater = new BinaryFormatter();
  51. MyObject obj=(MyObject)formater.Deserialize(stream);
  52. Console.WriteLine("对象已经被反序列化。" + obj.ToString());
  53. }
  54. }
  55. /// <summary>
  56. /// 二进制序列化对象
  57. /// </summary>
  58. /// <param name="obj"></param>
  59. public static void SOAPSerialize(MyObject obj)
  60. {
  61. using (FileStream stream = new FileStream("C://MyObject.soap", FileMode.Create, FileAccess.Write))
  62. {
  63. SoapFormatter formater = new SoapFormatter();
  64. formater.Serialize(stream, obj);
  65. Console.WriteLine("对象已经被序列化。" + obj.ToString());
  66. }
  67. }
  68. /// <summary>
  69. /// 二进制反序列化
  70. /// </summary>
  71. /// <param name="fileName"></param>
  72. public static void SOAPDeserialize(string fileName)
  73. {
  74. using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  75. {
  76. SoapFormatter formater = new SoapFormatter();
  77. MyObject obj = (MyObject)formater.Deserialize(stream);
  78. Console.WriteLine("对象已经被反序列化。" + obj.ToString());
  79. }
  80. }
  81. /// <summary>
  82. /// XML序列化
  83. /// </summary>
  84. /// <param name="obj"></param>
  85. public static void XMLSerialize(MyObject obj)
  86. {
  87. using (FileStream stream = new FileStream("C://MyObject.xml", FileMode.Create, FileAccess.Write))
  88. {
  89. XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
  90. serializer.Serialize(stream, obj);
  91. Console.WriteLine("对象已经被序列化。" + obj.ToString());
  92. }
  93. }
  94. /// <summary>
  95. /// XML反序列化
  96. /// </summary>
  97. /// <param name="fileName"></param>
  98. public static void XMLDeserialize(string fileName)
  99. {
  100. using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  101. {
  102. XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
  103. MyObject obj = (MyObject)serializer.Deserialize(stream);
  104. Console.WriteLine("对象已经被反序列化。" + obj.ToString());
  105. }
  106. }
  107. }
  108. }

可见通过上面三个类都能实现将对象序列化保存,并且都能反序列化还原到对象被序列化之前的状态(这正是序列化意义所在,能保存对象运行时的状态并且还能还原)。如果运行上面的代码会在C盘根目录下创建三个文件,分别是MyObject.dat、MyObject.soap和MyObject.xml文件,因为MyObject.dat是二进制文件,所以无法查看文件的内容,但是我们可以打开MyObject.soap和MyObject.xml这两个文件。

.net中对象序列化技术的更多相关文章

  1. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  2. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  3. asp.net中对象的序列化,方便网络传输

    对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...

  4. .Net高级技术——对象序列化

    对象序列化 “序列化是将一个对象保存到存储介质上或者将对象进行转换使之能够在网络上传送的行为”.通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是从文件或者数据库中取出数 ...

  5. 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

    序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...

  6. Android中数据的传递以及对象序列化

    Android中当两个Activity需要有信息交互的时候,可以使用Intent.具体来说: 发送单一类型数据: 发送方: String data = "Hello SecondActivi ...

  7. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  8. C#[Serializable]在C#中的作用-NET 中的对象序列化

    为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...

  9. Serializable在C#中的作用.net中的对象序列化 (转)

    序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...

随机推荐

  1. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  2. RF相关命令

    结果输出 RF通过命令执行用例及自定义报告与日志的位置 1.执行整个项目下的所有用例: pybot 项目路径.例如: pybot D:\robot PS:robot项目里面所有用例 2.执行某个sui ...

  3. 五一 DAY 7

    五一  DAY 7 P1514 引水入城 P1311 选择客栈 题解: P1315 观光公交 题解: 设 wait i 为最晚到达的旅客 arrive i 为到达i 的时刻 arrive i =max ...

  4. OSPF协议学习以及路由器配置

    OSPF协议学习以及路由器配置 1.实验任务 2,使用eNsp搭建网络拓扑 3.配置路由IP ps:要使用GE(3层口),2层口(E口)需要先配置Vlan才能配置IP地址 4.配置路由器R1的ospf ...

  5. MongoDB简单查询语句<平时使用语录,持续更新>

    MongoDB查询语句 --查询近三个月的客户使用量  aggregate:使用聚合  match:过滤  group分组   -- mysql中select org_code as 近三个月使用商户 ...

  6. Win10 安装LoadRunner11遇到的问题及解决方案

    由于以用户或者管理员身份执行setup.exe都不能正常安装,如下截图是异常信息.尝试了网上很多修改本地组策略的方法,还是不行,最后只能通过DOS命令来执行setup.exe.

  7. 阶段3 2.Spring_04.Spring的常用注解_5 自动按照类型注入

    运行出现了空指针异常 @Autowired 注解出现的位置 AutoWired的代码 常用的就是写类上和方法上. 运行测试,刚才运行是一个空指针异常 也就是通过Autowired 这个accountD ...

  8. LeetCode.1037-有效的回旋镖(Valid Boomerang)

    这是小川的第387次更新,第416篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第248题(顺位题号是1037).回旋镖是一组各不相同且不在一条直线上的三个点.给出三个点 ...

  9. 【神经网络与深度学习】Caffe训练执行时爆出的Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type

    自己建立一个工程,希望调用libcaffe.lib ,各种配置好,也能成功编译,但是运行就会遇到报错 F0519 14:54:12.494139 14504 layer_factory.hpp:77] ...

  10. 基于vant实现一个问卷调查

    实现背景 最近学习<vue实战>,第二篇进阶篇有一个练习 刚好最近在研究vue移动端框架vant 两者结合,实现这么个小项目 实现代码 新建 vue单文件 L0529L.vue <t ...