原文发布时间为:2009-10-27 —— 来源于本人的百度文章 [由搬家工具导入]

Serializalbe - Enable the object can be Serialized into a Stream

我理解到的就两个字: 流、持久存储

性能就一个字:快

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

在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您可以根据需要自定义序列化过程的一些重要功能。

持久存储
我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。

当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。

按值封送
对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。

如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则(请参阅序列化过程的步骤)。

基本序列化
要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:

[Serializable]
public class MyObject {
   public int n1 = 0;
   public int n2 = 0;
   public String str = null;
}
以下代码片段说明了如何将此类的一个实例序列化为一个文件:

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();
本例使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。

将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。以下代码片段说明了如何进行此操作。

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

// 下面是证明
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
上面所使用的 BinaryFormatter 效率很高,能生成非常紧凑的字节流。所有使用此格式化程序序列化的对象也可使用它进行反序列化,对于序列化将在 .NET 平台上进行反序列化的对象,此格式化程序无疑是一个理想工具。需要注意的是,对对象进行反序列化时并不调用构造函数。对反序列化添加这项约束,是出于性能方面的考虑。但是,这违反了对象编写者通常采用的一些运行时约定,因此,开发人员在将对象标记为可序列化时,应确保考虑了这一特殊约定。

转载于:https://www.cnblogs.com/handboy/p/7158362.html

Serializable在C#中的作用及其优点相关推荐

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

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

  2. [Serializable]在C#中的作用——实现.NET对象序列化

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

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

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

  4. 数据库索引的作用和优点缺点

    原文:数据库索引的作用和优点缺点 为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能.  第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.  第二,可以大大加快 数据的检索速 ...

  5. python嵌入式系统开发_Python在开发实时嵌入式系统中的作用

    原标题:Python在开发实时嵌入式系统中的作用 在过去的几年里,Python已经成为一种热门的程序语言.以著名的Monty Python喜剧小组命名,该语言是面向对象和解释.该属性导致Python在 ...

  6. 电厂运维的cis数据_变配电智能化运维作用和优点,智慧供配电物联网

    变配电智能化运维作用和优点,智慧供配电物联网 从实际情况出发,我们可以将电力系统划分为三个:发电.输电和配电,其直接过程就是发电系统发出的电能经由输电系统的输送,最后由配电系统分配给各个用户.在这三部 ...

  7. 项目管理在企业发展中的作用及未来的发展方向—— 来自项目管理群的讨论

    lwantstudy-PMO-DaLian 说: 3.9的主题,项目管理在企业发展中的作用 未来的发展方向,"思想者_pm_深圳"提出,老谷尝试分享 1. 项目管理在各性质的公司的 ...

  8. C语言在计算机专业的功能,C语言程序设计在高职院校计算机专业教学中重要作用.pdf...

    C语言程序设计在高职院校计算机专业教学中重要作用.pdf C语言程序设计在高职院校计算机专业教学中重要作用 韩迎红 山西警官职业学院信息工程系.太原030006 hyhhzwl12@163.tom [ ...

  9. poe交换机的作用和优点

    POE交换机就是支持网线供电的交换机,其不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电 .那么,poe交换机的作用和优点有哪些呢?接下来我们就跟随杭州飞畅的小编一起来看看吧! poe交 ...

最新文章

  1. oCPC:计算广告出价策略
  2. Angular单元测试里使用fixture.debugElement测试UI界面元素
  3. 关于文档的基本操作---ElasticSearch
  4. 外包以小时计算金额的费用_2020年初级会计各大税种的计算公式,请收藏!
  5. BigDecimal类整除报错的解决方案
  6. python数据库自动重连_python mysql断开重连的实现方法
  7. Qt学习笔记-使用shape() 使得碰撞更加精确
  8. js 防止重复提交方案
  9. session理论分析
  10. Python 深入浅出 - HelloWorld
  11. Android MTP 模式 驱动无法安装解决方案
  12. 编程程序_PLC编程代码PLC程序设计公司
  13. GO语言-panic和recover
  14. 2019 FeatherNets: Convolutional Neural Networks as Light as Feather for Face Anti-spoofing
  15. os系统解决seaborn中文乱码问题 Font family [‘SiHei‘] not found
  16. 利用tushare绘制投资组合可行集python代码
  17. 极简linux版本,4MLinux 26.0发布,这是一个极简版本
  18. 把照片唱给你听 | 腾讯AI Lab国际领先技术邀你「趣」体验
  19. 在WebGL场景中管理多个卡牌对象的实验
  20. 一图理解geos的九交矩阵模型——面面关系

热门文章

  1. Python 技术篇 - 利用os库实现读取遍历指定路径的文件,区分文件和文件夹
  2. 结构对齐--__packed与#pragma pack
  3. 匹配printf()说明符的类型
  4. 5.7 matlab数据插值与曲线拟合的比较
  5. tril--下三角矩阵的抽取
  6. 【OpenMP实现】任意线程数并行化快排结合Merge排序100w--10线程下只用0.06s
  7. pytorch基础操作学习笔记(autograd,Tensor)
  8. Dask.distributed创建client时出现报错
  9. ping不通www.baidu.com,但可以访问www.baidu.com网页
  10. 数据结构实验4:C++实现循环队列