怎样理解序列化

在 < <深入浅出MFC>>中对采用Serialize 机制原因有如此的描述: 对象导向有一个术语:Persistence,意思就是把对象永久保留下来。Power 一关,啥都没有,对象又如何能够永续存留?当然是写到文件去! 把资料写到文件,很简单。在Document/View 架构中,资料都放在一份document(文件)里头,我们只要把其中的成员变量依续写进文件即可。成员变量很可能是个对象,而面对对象,我们首先应该记载其类别名称,然后才是对象中的资料。"但是在实际的MFC设计程序的时候,难道源代码编译生成的exe文件,运行的时候不是已经实例化了对象了 下次运行的时候,再次实例化,为什么要保存? 一般做类似windows console的非MFC工程中的也没有提到序列化的概念,难道是MFC独有的概念,我觉的不保存对象也程序可以运行.能否详细的说明Serialize 机制的作用和采用的原因.

序列化可以将一个类对象保存到硬盘上,在用的时候,再把它转换为我们保存时的类对象. 这个过程就是一个序列化和反序列化.
 
二、对象的序列化主要有两种用途:

    1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中
    我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基 本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。

   2) 在网络上传送对象的字节序列
   对象仅在创建对象的应用程序域中有效。除非对象是从MarshalByRefObject派生得到或标记为&nbsp;Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为&nbsp;Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。如果对象是从MarshalByRefObject派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从MarshalByRefObject派生得到的对象标记为Serializable。远程使用此对象时,负责进行序列化并已预先配置为SurrogateSelector的格式化程序将控制序列化过程,并用一个代理替换所有从MarshalByRefObject派生得到的对象。如果没有预先配置为SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则.

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。

1、为什么要序列化:
首先你应该明白系列化的目的就不难理解他了。系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算。比如你的客户端要调用服务器上的一个方法获得一个产品对象,比如方法为:public Product findProduct(int product_id); 注意该方法返回一个Product对象,如果没有系列化技术,客户端就收不到返回的对象Product。而序列化的实现就是把对象变成一个可在网络上传输的字节流。

2、利用序列化技术,可以实现对象的备份和还原。序列化可以将内存中的对象(或对象图)序列化为数据流,并保存到磁盘上进行持久化;还可以将数据流反序列化为对象,实现对象的还原。序列化技术在分布式系统的数据传输中得到充分的利用,如:XML Web Service 利用XML序列化实现跨平台,.NET Remoting 则用到了二进制序列化和SOAP序列化。

比如用一个类描述一张合同,而这个类实例化后其中的字段保存着合同的信息,如果现在要把这个类的实例发送到另一台机器、另一个窗体或是想保存这个类以便以后再取出来用(持久化对象),可以对这个类进行序列化(序列化实际上是一个信息流),传送或保存,用的时候再反序列化重新生成这个对象


为什么您想要使用序列化?有两个最重要的原因促使对序列化的使用:一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本;另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。例如,序列化可用于在ASP.NET中保存会话状态并将对象复制到Windows窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。  
   

总结:
1.序列化的实现就是把对象变成一个可在网络上传输的字节流,可以实现对象的备份和还原
2.将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本
3.通过值将对象从一个应用程序域发送到另一个应用程序域中
4.系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算
5.将一个类对象保存到硬盘上,在用的时候,再把它转换为我们保存时的类对象
6.序列化的是对象的状态也就是对象数据成员的值和方法,是没有关系的跨应用程序域通信时,要用到序列化以及用WEB服务时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值