Java-深刻解析序列化.docx

Java-深刻解析序列化.docx

ID:57646082

大小:18.75 KB

页数:6页

时间:2020-08-30

Java-深刻解析序列化.docx_第1页
Java-深刻解析序列化.docx_第2页
Java-深刻解析序列化.docx_第3页
Java-深刻解析序列化.docx_第4页
Java-深刻解析序列化.docx_第5页
资源描述:

《Java-深刻解析序列化.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Java序列化序列化的用处:对象需要远程调用(比如说socket)对象需要在不同的进程间调用对象需要永久存放在硬盘上(脱离对象运行环境,编写成一个以字符串形式存在的对象,需要时,通过获取字符串,反序列化就能实现获取一个对象)首先说明一下序列化的知识:java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个相同的对象。序列化机制在java中有着广泛的应用,EJB、RMI等技术都是以此为基础

2、的。序列化机制是通过java.io.ObjectOutputStream类和java.io.ObjectInputStream类来实现的。在序列化(serialize)一个对象的时候,会先实例化一个ObjectOutputStream对象,然后调用其writeObject()方法;在反序列化(deserialize)的时候,则会实例化一个ObjectInputStream对象,然后调用其readObject()方法。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流

3、中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。如果我们不希望通过编译来强制划分软件版本

4、,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。设置serialVersionUID默认的生成方式:privatestaticfinallongserialVersionUID=545456546548431L;     serialVersionUID的作用:serialVersionUID用来表明类的不同版本间的兼容性。如果你修改了此类,要修改此值。否则以前用老版本的类序列化的类恢复时会出错。在JD

5、K中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,对于Test.class,执行命令:serialverTest。    为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入privatestaticfinallongserialVersionUID这个属性,具体数值自己定义。这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往

6、往不同,从而造成对象的反序列化因为类版本不兼容而失败。不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。转载:当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。把Java对象转换为字节序列的过程称为对象的序列化。把字节序列

7、恢复为Java对象的过程称为对象的反序列化。对象的序列化主要有两种用途:1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;2)在网络上传送对象的字节序列。一.            JDK类库中的序列化APIjava.io.ObjectOutputStream代表对象输出流,它的writeObject(Objectobj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序

8、列化为一个对象,并将其返回。、只有实现了Serializable和Externalizable接口的类的对象才能被序列化。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。