序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 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. SpringBoot通过@Value获取application.yml配置文件的属性值

    application.yml实例: spring: redis: database: 0 host: 127.0.0.1 获取方法: /** * @Auther:WangZiBin * @Descr ...

  2. Android 图片内存优化与图片压缩

    1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 ...

  3. C++ Vector实践

    实践如下: #include <iostream> #include <vector> #include <typeinfo> using namespace st ...

  4. save——model模块保存和载入使用简单例子

    https://www.w3xue.com/exp/article/201812/10995.html =====1====实践模型存入 import tensorflow as tf from te ...

  5. <table>表格与jqGrid

    第一次写博客比较生涩.接下来进入正题:...... 普通表格前端的增删改查. <%@ page language="java" contentType="text/ ...

  6. 阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备

    适应配置的方式解决我们刚才的编码操作 -dist结尾的就是spring 的开发包 解压好的 这里面是约束 libs是扎包 三个为一组,实际上只有21个 自己在使用需要导入jar包的时候,选择这种没有任 ...

  7. mybatis 动态SQL .1

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还要注意去掉 ...

  8. 在Opencv中将一幅图像均分成M* N个小图像

    std::vector<std::vector<Mat> > partitionImage(Mat&src,int rows,int cols) 函数中有三个输入参数, ...

  9. Python学习之进程

    8.2 进程 8.2.1 进程的创建 开启多进程scoketserver:server.client 进程的开启:python中的多线程,一定是有一个主进程,由主进程创建几个子进程, Linux与Wi ...

  10. centos6.5安装mysql报错

    安装完mysql后,mysql服务无法打开. 报错 查看mysql日志 执行命令:less /var/log/mysqld.log  发现是权限不够,不能创建pid文件.因此改变权限,再次启动服务 问 ...