转自:http://www.cnblogs.com/chjw8016/archive/2008/02/23/1078204.html

一、概述
    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
    把对象转换为字节序列的过程称为对象的序列化。
    把字节序列恢复为对象的过程称为对象的反序列化。

    二、对象的序列化主要有两种用途:
    1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
    我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁 盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基 本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
   2) 在网络上传送对象的字节序列。
   对象仅在创建对象的应用程序域中有效。除非对象是从MarshalByRefObject派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。如果对象是从MarshalByRefObject派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从MarshalByRefObject派生得到的对象标记为Serializable。远程使用此对象时,负责进行序列化并已预先配置为SurrogateSelector的格式化程序将控制序列化过程,并用一个代理替换所有从MarshalByRefObject派生得到的对象。如果没有预先配置为SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则.

  三、.NET提供了三种序列化方式
    [1]、XML Serializer
    [2]、SOAP Serializer
    [3]、BinarySerializer

四、基本序列化
    要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:
    [Serializable] 
    public class MyObject 
    { 
        public int n1 = 0; 
        public int n2 = 0; 
        public String str = null; 
    } 
   [BinarySerializer]
    将此类的一个实例序列化为一个文件:

MyObject obj = new MyObject(); 
obj.n1 = 1; 
obj.n2 = 24; 
obj.str = "一些字符串"; 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("MyFile.bin", FileMode.Create, 
FileAccess.Write, FileShare.None); 
formatter.Serialize(stream, obj); 
stream.Close();

反序列化:

IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("MyFile.bin", FileMode.Open, 
FileAccess.Read, FileShare.Read); 
MyObject obj = (MyObject) formatter.Deserialize(fromStream); 
stream.Close();

  [XMLSerializer]
    将此类的实例序列化成一个Xml文件.

XmlSerializer ser = new XmlSerializer(obj.GetType());
ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj);

反序列化:

XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));
MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));

说明:使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。    
    [SOAP Serializer]
    如果要求具有可移植性,请使用 SoapFormatter。所要做的更改只是将以上代码中的BinaryFormatter换 SoapFormatter,而 Serialize 和 Deserialize 调用不变。

.Net 中的序列化与反序列化[概述]相关推荐

  1. OWASP TOP 10(六)反序列化漏洞(序列化和反序列化、漏洞原理、PHP中的序列化和反序列化、魔术方法、Typecho_v1.0中的反序列化漏洞)

    文章目录 反序列化漏洞 一.概述 1. 序列化和反序列化 2. 序列化的目的 二.PHP中的序列化与反序列化 1. 概述 2. 示例序列化与反序列化 3. 反序列化漏洞 - PHP中的魔术方法 - T ...

  2. fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...

    点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...

  3. python中常用的序列化模块_Python中的序列化和反序列化

    为什么要序列化 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中. 设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列.所以必须把数据额转换为字节序列,输出到文件, ...

  4. 谈谈:.Net中的序列化和反序列化

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...

  5. .Net 中关于序列化和反序列化Json的方法

    .Net SDK中关于序列化和反序列化Json的方法 项目中遇到和服务端交互时需要传递数据包为json格式的包,所以在服务端和SDK中都需要对json进行解析和组合的操作, 并且对一些复杂结构的jso ...

  6. js序列化与反序列化和C#中json序列化与反序列化

    序列化:将Object转换成JSON字符串 let data = JSON.stringify(obj); // 将JSON对象转化为JSON字符 let data = obj.toJSONStrin ...

  7. JAVA中JSON序列化和反序列化

    JAVA中JSON序列化和反序列化 1 FASTJSON的序列化和反序列化 1.1 主函数 1.2 自定义对象 2 GSON序列化和反序列化 2.1 主函数 2.2 自定义对象 总结 不同包序列化和反 ...

  8. php中的序列化与反序列化[喜悦原创]

    php中的序列化与反序列化 1.serialize() <===> unserialize(),这个大家用的最多, 老熟人了 session保存默认用的就是这个. 如果想存储对象,数组数据 ...

  9. Unity中的序列化和反序列化

    一:前言 序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程.序列化最主要的用途就是传递对象和保存对象 在Unity中保存和加载.prefab.scene.Inspecto ...

最新文章

  1. Linux的chattr与lsattr命令详解
  2. 运用双腾讯云搭建《饥荒》多人联机服务器
  3. 旷视唐文斌:你到底给谁创造了什么样的价值?这是AI产品的灵魂拷问丨MEET2020...
  4. 吴恩达Deeplearning.ai课程学习全体验:深度学习必备课程 By 路雪2017年8月14日 11:44 8 月 8 日,吴恩达正式发布了 Deepleanring.ai——基于 Cours
  5. Qt Creator设置一个Autotools项目
  6. sublime text2 用ctags插件实现方法定位(转)
  7. SpringBoot Cache操作
  8. 基础算法之Dijkstra最短路径
  9. 深度学习(十九)——FCN, SegNet, DeconvNet, DeepLab, ENet, GCN
  10. 用Java 编写菜单价格和的程序_使用JAVA 编写一个程序,显示5中商品价格,用户可以选择多种商品并在其后的文本框输入购买的数量。...
  11. 【OpenCV 例程200篇】30. 图像的缩放(cv2.resize)
  12. python代码制作configure文件
  13. 【UML】时序图Sequence diagram(交互图)(转)
  14. WSS2.0 SP2升级到WSS3.0步骤
  15. Linux学习笔记二十——系统裁剪之二
  16. Spring Data Jpa 查询返回自定义对象
  17. DTCMS插件的制作实例电子资源管理(二)Admin后台页面编写
  18. 隐式差分matlab程序,油藏数值模拟隐式差分MATLAB源程序
  19. 三菱plcascll转换16进制_三菱ASCII码指令
  20. 在线演示(动画演示)各种算法的实现过程

热门文章

  1. php svn更改密码,svn 开启修改备注
  2. php 网络图片 execl,phpexcel图片获取
  3. linux 开机加载的文档,Linux 修改文档“打开方式”
  4. css表格强制不换行符,css控制table单元格强制换行与强制不换行
  5. mysql 一行转多多行_JS 小工具 MYSQL WHERE IN条件 去掉换行符(列转行)
  6. 服务器网卡有什么作用,服务器网卡的作用
  7. Oracle 常用系统数据查询SQL(转)
  8. linux启用dcb步骤,Linux DCB体系——简短概述
  9. c语言注释符的作用有哪两种,C语言编程的注释符号是?
  10. html的字母u代表什么意思,html元素 u 标签的使用方法及作用