Serializable作用

在用Java做《小小五子棋》这个项目案例时遇到的Serializable。

Serializable的作用:

  序列化技术准备用于序列化的对象必须设置 [System.Serializable] 标签,该标签指示一个类能够序列化。便于在网络中传输和保存 这个标签是类能够被序列化的特性,表示这个类能够被序列化。

序列化定义:  对象被临时保存在内存中,想要用介质转移对象并且把对象的状态保存下来,就必须把对象保存下来,这个过程被称为序列化。与之相对的是反序列化。

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

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

持久存储

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

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

当反序列化已序列化的类时,将又一次创建该类,并自己主动还原全部数据成员的值。

按值封送

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

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

序列化规则

因为类编译后便无法序列化,所以在设计新类时应考虑序列化。须要考虑的问题有:是否必须跨应用程序域来发送此类?是否要远程使用此类?用户将怎样使用此类?或许他们会从我的类中派生出一个须要序列化的新类。仅仅要有这样的可能性,就应将类标记为可序列化。除下列情况以外,最好将全部类都标记为可序列化:

全部的类都永远也不会跨越应用程序域。假设某个类不要求序列化但须要跨越应用程序域,请从 MarshalByRefObject 派生此类。

类存储仅适用于其当前实例的特殊指针。比如,假设某个类包括非受控的内存或文件句柄,请确保将这些字段标记为 NonSerialized 或根本不序列化此类。

某些数据成员包括敏感信息。在这样的情况下,建议实现 ISerializable 并仅序列化所要求的字段。

原文地址:https://www.cnblogs.com/zzl1218/p/10305405.html

时间: 2024-08-22 15:55:03

Serializable作用的相关文章

Serializable 作用

序列化的attribute,是为了利用序列化的技术 准备用于序列化的对象必须设置 [System.Serializable] 标签,该标签指示一个类能够序列化. 便于在网络中传输和保存 这个标签是类能够被序列化的特性,表示这个类能够被序列化. 什么叫序列化? 我们都知道对象是临时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,而且把对象的状态保持下来,就须要把对象保存下来,这个过程就叫做序列化,通俗点,就是把人的魂(对象)收伏成一个石子(可传输的介质) 什么叫反序列化? 就是再把介质

Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

Serizlizable

关闭 忧郁王子的专栏 伟大的意大利,伟大的罗伯特-巴乔 目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      每周荐书:分布式.深度学习算法.iOS(评论送书)      项目管理+代码托管+文档协作,开发更流畅 Serializable 标签: javaserializationjvmeclipseobjectclass 2011-09-04 16:56 11784人阅读 评论(0) 收藏 举报  分类: JSE(39)  版权声明:本文为博主原创文章,未经博主允许不得转载

异常情况下的生命周期分析

这里所说的异常主要是分为以下这在两种情况下的异常: 情况1.资源相关的系统配置发生改变Activity被杀死并被杀死重新创建Activity 情况2.资源内存不足导致低优先级的Activity被杀死 情况一具体: 那最简单的加载图片资源文件的机制来说,我们将图片放进drawable目录下,开发时为了兼容不同的设备,可能放的不只放在这一个目录中,还有drawable-mdpi, drawable-hdpi这些目录中,当程序启动的时候会根据设备的情况进行加载合适的图片资源,比如手机的横屏向竖屏进行切

serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Serializable其实是一个空接口 package java.io; public interface Serializable { } Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化. 什么情况下需要序列化 a)当你想把的内存中的对象写入到硬

implements Serializable有什么作用

没有implements Serializable,你就不能通过rmi(包括ejb)提供远程调用. serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象. serialization不但可以在本机做,而且可以经由网络操作(就是猫小说的RMI).这个好处是很大的----因为它自动屏蔽了操作系统的差异,字节顺序等.比如,在Window平台生成一个对象并序列化之,然后通过网络传到一台Unix机器上,然后可以在这

论unity中[System.Serializable]的作用

首先解释[System.Serializable]什么意思,就是把一个对象序列化(网上就是这么解释的),在unity中有什么作用呢请看一下代码便一目了然. 这是一个属性类,里面声明了4个字段: 1 using UnityEngine; 2 using System.Collections; 3 4 [System.Serializable] 5 public class Property { 6 7 public string name = "aa"; 8 public int age

Java序列化接口Serializable接口的作用总结

转载 http://www.cnblogs.com/DreamDrive/p/4005966.html 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从硬盘中读取就可以了.(存储到硬盘是一个文件,不需要我们去解析,如果用记事本打开解析会出现乱码,解析要用特定的方式,不用我们管. 我们只需要读取). 把对象存储到硬盘上的一个文件中,这个文件的标准扩展名是(.

C# Serializable对象序列化的作用

1.序列化定义:将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象. 在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本 2.使用序列化的原因:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域