当前位置: 首页 > 编程日记 > 正文

java序列化的作用-这个挺有用的,不妨学学

http://bbs.tech.ccidnet.com/read.php?tid=249048

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下:
  序列化是什么:
序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例
  序列化的什么特点:
如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
什么时候使用序列化:
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
=======================
可以看看接口java.io.serializable的中文解释:
Serializable
public interface Serializable
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和还原超类型的公用 (public)、受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。仅在子类型扩展的类有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此责任。如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。
在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数的构造方法。可序列化子类的字段将从该流中还原。
当遍历一个图形时,可能会遇到不支持可序列化接口的对象。在此情况下,将抛出 NotSerializableException,并将标识不可序列化对象的类。
在序列化和反序列化过程中需要特殊处理的类必须使用下列准确签名来实现特殊方法:
private void writeObject(java.io.ObjectOutputStream out)
  throws IOException
private void readObject(java.io.ObjectInputStream in)
  throws IOException, ClassNotFoundException;
writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。
readObject 方法负责从流中读取并还原类字段。它可以调用 in.defaultReadObject 来调用默认机制,以还原对象的非静态和非瞬态字段。defaultReadObject 方法使用流中的信息来分配流中通过当前对象中相应命名字段保存的对象的字段。这用于处理类发展后需要添加新字段的情形。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。
将对象写入流时需要指定要使用的替代对象的可序列化类,应使用准确的签名来实现此特殊方法:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
此 writeReplace 方法将由序列化调用,前提是如果此方法存在,而且它可以通过被序列化对象的类中定义的一个方法访问。因此,该方法可以拥有私有 (private)、受保护的 (protected) 和包私有 (package-private) 访问。子类对此方法的访问遵循 java 访问规则。
在从流中读取类的一个实例时需要指定替代的类应使用的准确签名来实现此特殊方法。
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
此 readResolve 方法遵循与 writeReplace 相同的调用规则和访问规则。
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修改器显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类 -- serialVersionUID 字段作为继承成员没有用处。

转载于:https://www.cnblogs.com/rongxh7/archive/2010/05/20/1739701.html

相关文章:

二分法典例:木棒切割问题

Input : 输入木棒根数n,要得到的等长木棒数量K,以及n根木棒的长度。 Output : 等长木棒的最大长度。 用二分法求解这道题,首先要找到以得到的等长木棒数量为因变量、等长木棒长度为自变量函数。 int getK(int l){//随着l增大,返…

对Android 开发者有益的 40 条优化建议(转)

下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题对每个你像添加的特征重复上述过程。这种方法能够激励你,因为你在保持不断迭代,不经意中你学到…

英语语法总结--连词

连词 连词是一种虚词, 它不能独立担任句子成分而只起连接词与词,短语与短语以及句与句的作用。连词主要可分为两类:并列连词和从属连词。并列连词用来连接平行的词、词组和分 句。如:and, but, or, nor, so, therefore, yet, howe…

开放平台鉴权以及OAuth2.0介绍

OAuth 2.0 协议 OAuth是一个开发标准,允许用户授权第三方网站或应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的内容。OAuth 2.0不兼容1.0。协议的参与者 RO (resource owner): 资源所有者&#xf…

1044 Shopping in Mars

这题我写了两个二分函数。 BS借用的模板是找到第一个大于等于总价的商品下标,然后返回的是钻石价值和减去商品总价,通过遍历来得到最小的差值,注意遍历的最后一个数字的时候可能会返回负值,所以只有当返回值大于等于0才可以用来竞…

nodeJS之eventproxy源码解读

1.源码缩影 !(function (name, definition) { var hasDefine typeof define function, //检查上下文环境是否为AMD或CMD hasExports typeof module ! undefined && module.exports; //检查上下文环境是否为Node if (hasDefine) { define(definition); //AMD环境或CM…

解决phpmyadmin3.4空密码登录被禁止登陆的方法

很多时候我们在本机测试时会将root用户密码设置为空。因为我把php升级到了5.3.1,以前的phpmyadmin版本不能用了,就升级到phpMyAdmin 3.2.4版的时候,会遇到无法以空密码登录root用户的情况。怎么解决呢? 请参照如下步骤: 1、打开程…

CentOS安装新版RabbitMQ解决Erlang 19.3版本依赖

2019独角兽企业重金招聘Python工程师标准>>> 通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守。 RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是安装的时候会提示需要erl…

1048 Find Coins(二分法解法)

非常基础的二分法-寻找序列中是否存在某一条件的元素 的应用 AC代码 #include<cstdio> #include<iostream> #include<set> #include<vector> #include<map> #include<algorithm>using namespace std;const int SUP 100000000; const in…

关于chrome等浏览器不支持showModalDialog的解决方案

目前&#xff0c;新版本的chrome和opera、Firefox等浏览器已经不支持showModalDialog方法。 如果是没有接收返回值的&#xff0c;可以直接将window.showModalDialog改为window.open。 需要接收返回值的情况&#xff1a; 父页面设置&#xff1a; var uIdName; function chooseus…

Flex Javascript 交互实现代码

关键字&#xff1a;ExternalInterface所用类库&#xff1a;SWFObject/*** Flex调用Javascript函数* params functionName:String Javascript函数名称* params ...params Javascript函数参数* return 返回Javascript函数的return内容**/ExternalInterface.call(functionName:Str…

C#反射使用时注意BindingFlags的用法(转载)

最近刚刚开始用反射做项目&#xff0c;遇到一个小的知识点&#xff0c;记录一下。 c#反射查找方法时&#xff0c;默认只能查到public方法。如果想要查找private方法&#xff0c;需要设定BindingFlags. 即&#xff1a; BindingFlags.Public|BindingFlags.Instance 默认…

1126 Eulerian Path

主要考英语或者数学基础。 一幅连通图的奇点个数为0或2时才能够被一笔画。 连通图的判断用DFS来计数。 连通图0个奇点&#xff1a;Eulerian 连通图2个奇点&#xff1a;semi-Eulerian 非连通图/连通图其他数量的奇点&#xff1a;non-Eulerian AC代码 #include<cstdio&…

各种小的 dp (精)

Q~ 抛一枚硬币 n 次&#xff0c;每次可能是正面或者反面向上&#xff0c;求没有连续超过 k 次硬币向上的方案数 A &#xff1a; dp[ i ] 表示到 i 位置的方案数&#xff0c; 1 . 当 i < k 时&#xff0c; dp[i] dp[i-1]*2 2 . 当 i k 时&#xff0c; dp[i] dp[i-1]*2 - 1…

写给还在大学的兄弟姐妹

看到软件专业毕业生之一个月攻略 这篇文章之后&#xff0c;忽然想起了自己两个多月前找工作时的写的一篇文章&#xff0c;便拿出来与大家分享。这仅是个人的一些看法&#xff0c;不正确之处还请各位指出&#xff0c;有砖尽管拍。 基础很重要 许多企业招聘&#xff0c;要求大学…

grunt学习

1、http://javascript.ruanyifeng.com/tool/grunt.html Grunt&#xff1a;任务自动管理工具 2、转载于:https://www.cnblogs.com/king-bj/p/4322794.html

IP地址和MAC地址

MAC地址又称硬件地址&#xff0c;是MAC帧的头部&#xff0c;在数据链路层只能看见MAC地址。 IP地址是逻辑地址&#xff0c;是IP数据报的头部&#xff0c;路由器根据IP地址进行路由选择。 IP地址为4个字节32位&#xff0c;编制经历了3个历史阶段。 MAC地址为6个字节48位。

ie9下console不兼容的问题

最近在调整项目在ie9下的展示问题&#xff0c;发现在ie9下&#xff0c;js文件不执行&#xff0c;打开控制台才执行&#xff0c;原因是ie9不支持console&#xff0c;以下给出两种解决方案&#xff1a;1. 在webpack.prod.conf.js 中添加并修改js插件配置项&#xff08;我用的是we…

[转载] linux、Solaris下xdmcp远程桌面服务

原文链接 http://youlvconglin.blog.163.com/blog/static/52320420106243857254/ 使用图形界面远程登录linux和Solaris&#xff0c;首先要在服务端开启xdmcp服务&#xff0c;windows下使用xmanager连接 Ubuntu下则使用下默认也安装了该客户端&#xff0c;一次打开[应用程序]-[…

3.2.4 控制图层显示的范围

为了是地图更加简洁 和 减小地图负载 &#xff0c;达到分级显示某些图层的效果&#xff0c;应该为每一个图层设置 合理的 可见比例尺范围。1 begin2 3 aeMapMain.Layer[2].MaximumScale :500000;//最大可见比例尺 分母4 aeMapMain.Layer[2].MinimumScale :1000000;//最小可见比…

1103 Integer Factorization 需再做

本题是典型的DFS剪枝 我对DFS有了更深的认识&#xff1a;整个过程就是一片森林(根节点不唯一)的生长&#xff0c;到了界限就得到结果并返回或者得不到结果也返回&#xff0c;DFS的参数存放的是所有需要积累的变量。 提示&#xff1a; 1. 最外层的while或者for可以看成是一个…

POJ1001--Exponentiation(幂计算)翻译

Exponentiation幂计算Time Limit: 500MSMemory Limit: 10000KTotal Submissions: 141868Accepted: 34673 Description 描述 Problems involving the computation of exact values of very large magnitude and precision are common. 高精度、大数值的计算问题是很常见的&…

datatable无法设置横向滚动条(设置无效)

datatable设置横向滚动条无效 js如下&#xff1a; 页面如下&#xff1a; 设置 scrollx 属性为true时&#xff0c;还需在 table 添加 style"white-space: nowrap; "最终效果&#xff1a; 转载于:https://www.cnblogs.com/renzp/p/10069594.html

水晶报表导出数据并实现打印

要在里一个页面上进行操作 ReportDocument rdocument new ReportDocument(); //公用打印方法 ExportCrystalL ExCrystal new ExportCrystalL(); User u new User(); #region 加载页面 protected void Page_Load(object sender, EventArgs e) { if (!IsPostB…

1130 Infix Expression

考察&#xff1a;DFS进行中序遍历。 注意&#xff1a;给除了根节点以外的父节点加左右括号。 AC代码 #include<cstdio> #include<iostream> #include<set> #include<vector> #include<map> #include<algorithm> #include<cmath> …

学习笔记之vue根据权限动态添加路由

路由守卫判断 router.beforeEach((to, from, next) > {if (to.path /login) {sessionStorage.removeItem(user);}if (!user && to.path ! /login&&location.search ! ?validate) {next({ path: /login })} else {next()} }) 复制代码 点击登陆后&#xff…

javascript重置(base层)(。。。。不完整)

1、nextSibling浏览器兼容问题 <ul><li id"item1"></li><li id"item2"></li><li id"item3"></li> </ul> var item1document.getElementById("item1"); alert(item1.nextSibling.id);…

java myeclipse jar 导出问题

1.工程 jdk要和实际jdk最好一个版本;2.有外部导入的jar,导出时应用manifest&#xff0c;设置外部引用JAR。例如&#xff1a;Manifest-Version: 1.0 Sealed: true Class-Path: lib/log4j-1.2.8.jar lib/xercesImpl.jar Main-Class: com.unimoco.mmsplatform.handler.MMSMOCenter…

漫谈回溯(未完待续)

将不使用优化算法、直接用朴素算法来解决问题的做法称为暴力法。 回溯是带优化的穷举。 回溯是具有界限函数的深度优先搜索。

sendStickyBroadcast和sendStickyOrderedBroadcast

sendStickyBroadcast和sendStickyOrderedBroadcast - 牛仔的移动开发博客 - 博客频道 - CSDN.NET sendStickyBroadcast和sendStickyOrderedBroadcast发出的广播会一直滞留&#xff08;等待&#xff09;&#xff0c;以便有人注册这则广播消息后能尽快的收到这条广播。其他功能与…