序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 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. CentOS 6.5 安装OSA监控精灵监控主机

    OSA监控是一个开源的图形化免费好用的监控,安装之前首先要配置好PHP环境, yum install httpd mysql mysql-server php-mysql php* -y 编辑http ...

  2. 创建一个包含TC的Alpine镜像

    镜像的创建 更换镜像至ustc(为了测试时的速度) 安装musl-dev make gcc linux-headers bison flex以使TC可以编译 拷贝进TC的源代码 进入源代码文件夹进行编 ...

  3. OpenStack 2018 年终盘点

    目录 文章目录 目录 前言 OpenStack 一年来的成长 Nova Cinder Neutron Ironic Cyborg Octavia Kolla Magnum Zun Kuryr 从 Op ...

  4. Python学习之==>数组(一)

    1.定义数组 city = [] # 定义一个空数组 name = ['Jack','Panda','Bob','Franck'] # 根据下标找元素,最前面一个元素的下标是0,最后一个元素下标是-1 ...

  5. Java SE 8 docs——Static Methods、Instance Methods、Abstract Methods、Concrete Methods和field

    一.Static Methods.Instance Methods.Abstract Methods.Concrete Methods ——Static Methods:静态方法 ——Instance ...

  6. Dynamic Web TWAIN——网页扫描SDK

    下载地址:[https://www.dynamsoft.com/Support/DWTGuide/Dynamic%20Web%20TWAIN%20SDK.html] API:[http://devel ...

  7. datagrid——jQuery EasyUI

    API文档:[http://www.jeasyui.com/documentation/datagrid.php] 一.创建datagrid 在页面上添加一个div或table标签,然后用jquery ...

  8. Spring事务管理配置以及异常处理

    Spring事务管理配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  9. 问题记录 | 配置ubuntu18.04+cuda9.0+cudnn服务器tensorflow-gpu深度学习环境

    因为实验室服务器资源有限,我被分配的服务器经常变化,但是常常就分到连显卡驱动以及cuda都没有装的服务器,真的很头疼,我已经配了四五台了,特此记录一下,以便以后直接照版本安装. Install nvi ...

  10. 奉献pytorch 搭建 CNN 卷积神经网络训练图像识别的模型,配合numpy 和matplotlib 一起使用调用 cuda GPU进行加速训练

    1.Torch构建简单的模型 # coding:utf-8 import torch class Net(torch.nn.Module): def __init__(self,img_rgb=3,i ...