#序列化的控制Externalizable
通过实现Externalizable 接口,用它代替Serializable 接口,便可控制序列化的具体过程
这个Externalizable 接口扩展了 Serializable,并增添了两个方法:writeExternal()和readExternal()在序列化和重新装配的过 程中,会自动调用这两个方法,以便我们执行一些特殊操作
通过实现Externalizable 接口,用它代替Serializable 接口,便可控制序列化的具体过程
这个Externalizable 接口扩展了 Serializable,并增添了两个方法:writeExternal()和readExternal()在序列化和重新装配的过 程中,会自动调用这两个方法,以便我们执行一些特殊操作
千万不可仅在 writeExternal()方法执行期间写入对象的重要数据(没有默认的行为可用来为一个 Externalizable 对象写入所有成员对象)的,而是必须在 readExternal()方法中也恢复那些数据
package com.zy.chapter10;
import java.io.*;
class Cat1 implements Externalizable {
private String catName;
public Cat1(String catName) {
this.catName = catName;
System.out.println("Cat1 Constructor");
}
public Cat1(){
System.out.println("Cat1 constructor2");
}
//recover date in readExternal
@Override
public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException {
System.out.println("cat1 readExternal");
this.catName=(String) arg0.readObject();
}
//save date in writeExternal
@Override
public void writeExternal(ObjectOutput arg0) throws IOException {
System.out.println("cat1 writeExternal");
arg0.writeObject(catName);
}
public String getName(){
return catName;
}
}
class Cat2 implements Externalizable{
private String catName;
public Cat2(String catName) {
this.catName = catName;
System.out.println("Cat2 Constructor");
}
public Cat2(){
System.out.println("Cat2 constructor2");
}
//recover date in readExternal
public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException {
System.out.println("cat2 readExternal");
}
//save date in writeExternal
public void writeExternal(ObjectOutput arg0) throws IOException {
System.out.println("cat2 writeExternal");
}
public String getName(){
return catName;
}
}
/**
*
* @ClassName ExternalizableDemo.java
* @function function of Externalizable Class
* @author yiz
* @version V1.0
* @date 2018年1月11日
*/
public class ExternalizableDemo {
public static void main(String[] args) {
Cat1 cat=new Cat1("kitty");
try {
//write object
ObjectOutputStream objouts=new ObjectOutputStream(new FileOutputStream("cat1.txt"));
objouts.writeObject(cat);
objouts.close();
//read object
ObjectInputStream objins=new ObjectInputStream(new FileInputStream("cat1.txt"));
//use constructor2
Cat1 cat1=(Cat1) objins.readObject();
objins.close();
System.out.println("cat1 "+cat1.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
//not save and recover the date in writeExternalizable and readExternalizable
Cat2 cat2=new Cat2("kitty2");
try {
//write object
ObjectOutputStream objouts=new ObjectOutputStream(new FileOutputStream("cat2.txt"));
objouts.writeObject(cat2);
objouts.close();
//read object
ObjectInputStream objins=new ObjectInputStream(new FileInputStream("cat2.txt"));
//use constructor2
Cat2 cat3=(Cat2) objins.readObject();
objins.close();
System.out.println("cat1 "+cat3.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Cat1 Constructor
cat1 writeExternal
Cat1 constructor2
cat1 readExternal
cat1 kitty
Cat2 Constructor
cat2 writeExternal
Cat2 constructor2
cat2 readExternal
cat1 null