序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 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. Fiddlercore拦截并修改HTTPS链接的网页,实现JS注入

    原始出处:https://www.cnblogs.com/Charltsing/p/FiddlerCoreHTTPS.html Fiddlercore可以拦截和修改http的网页内容,代码在百度很多. ...

  2. Cannot find terminfo entry for 'linux'.

    解决方案: 1. 查看 /usr/share/terminfo 目录下的内容,该目录的内容表示该主机支持哪些终端类型. 2. 通过修改系统变量TERM为vt100. 执行 export TERM=vt ...

  3. Custom Configuration 的两种方法:1.Configuration Sections

    第一种Configuration Sections 1.App.config 2.CustomConfigurationManager.cs 3.TestProgram.cs. App.config ...

  4. 常用 tcpdump 抓包方式

    目录 文章目录 目录 tcpdump 指令 关键字 常用指令选项 常规操作示例 过滤主机 过滤端口 过滤网络(网段) 过滤协议 复杂的逻辑表达式过滤条件 参考资料 tcpdump 指令 tcpdump ...

  5. Fiddler抓取APP接口

    1.获取本机IP地址 2.打开手机设置无线连接(需要和电脑在同一局域网) 长按wifi连接修改无线连接 打开高级选项,设置主机名和端口后保存 3.设置Fiddler 从下图可以看出,抓到的全是HTTP ...

  6. fastcgi_params 与 fastcgi.conf的区别

    参照文档: http://blog.51cto.com/noican/1766676

  7. 【推荐算法工程师技术栈系列】程序语言--Java

    目录 JDK 初步 ArrayList LinkedList Vector Stack HashMap Hashtable LinkedHashMap TreeMap HashSet LinkedHa ...

  8. 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!

    本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ...

  9. jmeter-在beanshell里用代码提取参数

    接口返回json(response_data): { "Code":1, "Message":null, "Error":null, &qu ...

  10. python 列表的(总结)

    列表(自我总结) 1.在python中什么是列表 列:排列,表:一排数据 在python中的表达就是 l = [1,2,3,4,5,6,7] 2.列表是可变类型还是不可变类型 也就是说列表能不能被ha ...