《对象的序列化与反序列化.ppt》由会员分享,可在线阅读,更多相关《对象的序列化与反序列化.ppt(16页珍藏版)》请在三一办公上搜索。
1、Java对象的序列化与反序列化,本章内容,对象序列化与反序列化的基本概念实现序列化的基本过程 Serializable和Externalizable接口 ObjectOutputStream和ObjectInputStream自定义序列化的两种方式默认序列化方式与自定义序列化方式的比较序列化类不同版本的序列化兼容性,对象序列化,对象序列化:将Java对象转化成二进制字节流的过程。对象反序列化:将二进制字节流恢复为Java对象的过程。对象序列化的主要用途:将对象的字节序列永久的保存到硬盘上,通常存放在一个文件中。(2)在网络中传输对象的字节序列。,Serializable和Externaliza
2、ble接口,序列化的过程:只有实现了Serializable和Externalizable接口的类的对象才能进行序列化操作。Externalizable接口继承自Serializable口,实现Externalizable接口的类需要自行控制序列化的行为。实现Serializable接口的类采用默认的序列化方式。JDK类库中的部分类(String,封装类和Date类等)都实现了Serializable接口。,ObjectInputStream和ObjectOutputStream,(2)对象输入和输出流构造方法:ObjectInputStream(InputStream in)ObjectOu
3、tputStream(OutputStream out)见源文件:ObjectSerTest.java,ObjectInputStream,ObjectInputStream按照默认方式进行反序列化时,具有以下特点:(1)如果内存中对象所属的类还没有加载,那么会加载并初始化这个类。如果在classpath中找不到相应的类文件,抛出ClassNotFoundException。(2)在反序列化时不会调用类的任何构造方法。,对象序列化,注意的问题:(1)序列化和反序列化的顺序要一致(2)保存对象的文件名一般不要用.txt文件,换成.obj或.ser文件最好,对象序列化,ObjectOutputSt
4、ream只能对实现了Serializable接口的类的对象进行默认的序列化操作,这种操作仅仅为对象的非transient和非static的实例变量进行序列化。见源文件:ObjectSerTest1.java 注意:静态变量属于类,不属于对象。静态变量在类加载的时候初始化,将含有静态变量的对象的序列化和反序列化分开在不同的进程中,以得到正确结果。见源文件:WriteStudent.java ReadStudent.java,transient成员变量,transient变量不能被序列化,那么可以修饰以下类型的变量。(1)实例变量不代表对象的固有的内部数据,仅仅代表具有一定逻辑含义的临时数据。.p
5、rivate String firstName;private String lastName;private transient String fullName;(2)实例变量表示一些比较敏感的信息(密码等),出于安全方面的原因不希望被序列化。(3)实例变量需要按照用户自定义的方式序列化,如经过加密后再序列化。,具有关联关系的对象之间的序列化,Class Teacher implements Serializable private Set stu=new HashSet();当序列化Teacher对象时,系统还会序列化Teacher所关联的其他可序列化的对象(Student对象)。,自定义
6、序列化方式-Serializable接口,自定义序列化方式,在可序列化类中定义下面两个方法:private void writeObject(ObjectOutputStream out)throws IOExceptionprivate void readObject(ObjectInputStream in)throws IOException,ClassNotFoundException 注意:上述两个方法不是接口中定义的方法,自定义序列化方式-Serializable接口,自定义序列化方式常用于以下情况:确保序列化的安全性,对敏感信息加密后再序列化,在反序列化时先解密。见源文件:Obj
7、SerSecurity.java(2)确保对象的成员变量符合正确的约束条件。见源文件:ObjSerConstraint.java(3)能够优化序列化的性能 见源文件:ObjSerCapacity.java ObjSerOptimizeCapacity.java 注意:需要按自定义方式序列化的成员变量,是否定义为 transient类型无关紧要。,自定义序列化方式-Externalizable接口,Externalizable接口继承自Serializable接口。如果一个类实现了Externalizable接口,那么将完全由这个类控制自身的序列化行为。public void writeExte
8、rnal(ObjectOutput out)throws IOException public void readExternal(ObjectInput in)throws IOException,ClassNotFoundException 注意:对实现了Externalizable接口的类的对象进行反序列化操作时,会调用该类无参的构造方法 见源文件:ObjExternalSer.java,默认序列化与自定义序列化的比较,默认序列化方式的不足对象当中的不易对外公开的敏感数据进行序列化,安全性低。(2)不会检查对象的成员变量是否合乎正确的约束条件。(3)默认的序列化方式需要对对象图进行递归遍
9、历,如果对象图很复杂,会消耗很多空间和时间,甚至引起Java虚拟机堆栈溢出。自定义序列化方式两种:实现Serializable接口,并且提供private的writeObject()和readObject()。(2)实现Externalizable接口,实现writeExternal()和readExternal()方法,必须提供public无参的构造方法。,可序列化类的不同版本的序列化兼容性,实现Serializable接口的类都有一个表示序列化版本标识符的静态常量。private static final long serialVersionUID;JDK安装目录的bin目录下有个serialver.exe用于查看serialVersionUID。用法:serialver 字节码serialVersionUID依赖于内部的实现细节与编译器。,可序列化类的不同版本的序列化兼容性,建议在可序列化类中显示的定义serialVerUID。在某些场合,希望类的不同版本对序列化兼容,需要确保类的不同版本具有相同的serialVerUID。在某些场合,不希望类的不同版本序列化兼容,需要确保类的不同版本具有不同的serialVerUID。,
链接地址:https://www.31ppt.com/p-5965179.html