Java 对象序列化详解以及实例实现和源码下载

Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持 3 性能略差

实现Externalizable接口 1 程序员决定存储哪些信息 2 仅仅提供两个空方法,实现该接口必须为两个空方法提供实现 3 性能略好

由于实现Externalizable接口导致了编程复杂度的增加,所以大部分时候采用实现Serializable接口方式实现序列化。 下面给出一个实例

{private String name;private int age;public String getName() {return name;}(String name) {this.name = name;}() {return age;}(int age) {this.age = age;}@Overridepublic String toString() {return “name=”+this.name + “,age=” + this.age;}}

这是一个PersonBean类,就这么简单已经实现了PersonBean类的序列化。 下面就可以使用ObjectInputStream、ObjectOutputStream类进行对象的写入和读取操作了。 代码如下:

(String[] args) {PersonBean personBean1 = new PersonBean();personBean1.setName(“long”);personBean1.setAge(20);PersonBean personBean2 = new PersonBean();personBean2.setName(“fei”);personBean2.setAge(25);ObjectOutputStream objectOutputStream = null;ObjectInputStream objectInputStream = null;String path = “D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt”;try {FileOutputStream fileOutputStream = new FileOutputStream(path);FileInputStream fileInputStream = new FileInputStream(path);objectOutputStream = new ObjectOutputStream(fileOutputStream);objectOutputStream.writeObject(personBean1);objectOutputStream.writeObject(personBean2);objectInputStream = new ObjectInputStream(fileInputStream);PersonBean personBean3 = (PersonBean)objectInputStream.readObject();PersonBean personBean4 = (PersonBean) objectInputStream.readObject();System.out.println(personBean3.toString());System.out.println(personBean4.toString());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}finally{if (objectOutputStream != null) {try {objectOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}

结果图:

Java中允许自定义序列化,提供了一个修饰符transient,该修饰符只能修饰Field字段,不能修饰方法和类,该修饰符达到的效果是把被修饰的Field完全隔离在序列化机制之外。这样导致在反序列化回复java对象时无法取得该Field值。 现在把PeronBean类的age字段使用该修饰符修饰,其他代码保持不变如下:

{private String name;age;…………..

然后再运行程序Demo,,结果如下:

看到了结果大家应该明白了该修饰符的意义了吧。

自定义序列化机制还没有这么简单,还可以更强大。 在序列化和反序列化过程中需要特殊处理的类提供如下特殊签名的方法,这些特殊的方法用以实现自定义序列化

(java.io.ObjectOutputStream) throws IOException(java.io.ObjectInputStream) throws IOException,ClassNotFoundException() throws ObjectStreamException

writeObject方法负责写入特定累的实例状态,readObject方法可以回复它 当序列流不完整时,readObjectNoData方法可以用来正确地初始化反序列化的对象:例如,接收方使用的反序列化类的版本不用于发送方,或者接收方版本扩展的类不是放松方版本扩展的类,或者序列化流被篡改时,系统都会调用readObjectNoData方法类初始化反序列化的对象。 下面重写PersonBean类,自定义序列化,代码的如下:

{private String name;age;public String getName() {return name;}(String name) {this.name = name;}() {return age;}(int age) {this.age = age;}(ObjectOutputStream out) throws IOException{out.writeObject(new StringBuffer(name).reverse());out.writeInt(age);}(ObjectInputStream in) throws ClassNotFoundException, IOException{this.name = ((StringBuffer)in.readObject()).toString();this.age = in.readInt();}@Overridepublic String toString() {return “name=”+this.name + “,age=” + this.age;}}

writeObject方法,把名字反转后写入,readObject方法直接读取反转后的名字即可。Demo类代码不变,结果如图:

从结果可以看出自定义序列化已经实现,并且writeObject、readObject也已经被调用了。

人的一生要疯狂一次,无论是为一个人,一段情,一段旅途,或一个梦想。

Java 对象序列化详解以及实例实现和源码下载

相关文章:

你感兴趣的文章:

标签云: