Serializable作用
Posted zzl1218
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Serializable作用相关的知识,希望对你有一定的参考价值。
在用Java做《小小五子棋》这个项目案例时遇到的Serializable。
Serializable的作用:
序列化技术准备用于序列化的对象必须设置 [System.Serializable] 标签,该标签指示一个类能够序列化。便于在网络中传输和保存 这个标签是类能够被序列化的特性,表示这个类能够被序列化。
序列化定义: 对象被临时保存在内存中,想要用介质转移对象并且把对象的状态保存下来,就必须把对象保存下来,这个过程被称为序列化。与之相对的是反序列化。
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包含类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象全然同样的副本。
在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。仅仅要您对此过程有足够的控制能力,就能够使该过程在非常大程度上自己主动进行。比如,简单的二进制序列化不能满足须要,或者,因为特定原因须要确定类中那些字段须要序列化。下面各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您能够依据须要自己定义序列化过程的一些重要功能。
持久存储
我们常常须要将对象的字段值保存到磁盘中,并在以后检索此数据。虽然不使用序列化也能完毕这项工作,但这样的方法通常非常繁琐并且easy出错,并且在须要跟踪对象的层次结构时,会变得越来越复杂。能够想象一下编写包括大量对象的大型业务应用程序的情形,程序猿不得不为每个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
公共语言执行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自己主动的序列化机制。对象序列化后,类的名称、程序集以及类实例的全部数据成员均被写入存储媒体中。对象通经常使用成员变量来存储对其它实例的引用。类序列化后,序列化引擎将跟踪全部已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构能够自己主动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的全部对象都必须标记为 Serializable(请參阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。
当反序列化已序列化的类时,将又一次创建该类,并自己主动还原全部数据成员的值。
按值封送
对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject
派生得到或标记为 Serializable,否则,不论什么将对象作为參数传递或将其作为结果返回的尝试都将失败。假设对象标记为
Serializable,则该对象将被自己主动序列化,并从一个应用程序域传输至还有一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。
假设对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至还有一个应用程序域的是对象引用,而不是对象本身。也能够将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换全部从 MarshalByRefObject 派生得到的对象。假设没有预先配置为 SurrogateSelector,序列化体系结构将遵从以下的标准序列化规则(请參阅序列化过程的步骤)。
序列化规则
因为类编译后便无法序列化,所以在设计新类时应考虑序列化。须要考虑的问题有:是否必须跨应用程序域来发送此类?是否要远程使用此类?用户将怎样使用此类?或许他们会从我的类中派生出一个须要序列化的新类。仅仅要有这样的可能性,就应将类标记为可序列化。除下列情况以外,最好将全部类都标记为可序列化:
全部的类都永远也不会跨越应用程序域。假设某个类不要求序列化但须要跨越应用程序域,请从 MarshalByRefObject 派生此类。
类存储仅适用于其当前实例的特殊指针。比如,假设某个类包括非受控的内存或文件句柄,请确保将这些字段标记为 NonSerialized 或根本不序列化此类。
某些数据成员包括敏感信息。在这样的情况下,建议实现 ISerializable 并仅序列化所要求的字段。
以上是关于Serializable作用的主要内容,如果未能解决你的问题,请参考以下文章