import java.io.Externalizable; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.util.Date; /** * 控制序列化就是有选择的序列化对象,而不是把所有对象的一切内容进行序列化。 * SerializeObject演示了使用transit关键字可以控制变量不被序列化。 * 本程序将演示通过实现Externalizable接口控制对象的序列化和反序列化。 */ public class SerializeControl { /** * 内部类,用于测试控制对象的序列化和反序列化。 * 被序列化的对象必须实现Externalizable接口,该接口有2个方法: * writeExternal方法、readExternal方法。 * 当序列化对象的时候,writeExternal方法会自动执行,所有的对象写入操作由该方法控制。 * 反序列化对象的时候,readExternal方法会自动执行,如果想访问writeExternal写入的内容, * 也只能在该方法里编写恢复对象的代码。 */ static class MyClassControl implements Externalizable{ int serialClassInt; int a=3, b=4; public MyClassControl(){ System.out.println("MyClass constructor!"); this.serialClassInt = 9; } public void show(){ System.out.println("serialClassInt: " + serialClassInt); } //当序列化对象的时候,该方法自动被调用 public void writeExternal(ObjectOutput out) throws IOException{ System.out.println("run writeExternal"); //可以在序列化时写非自身的变量, Date d = new Date(); out.writeObject(d); //只序列化serialClassInt变量,a、b两个变量不被序列化 out.writeInt(this.serialClassInt); } // 当反序列化对象的时候, 该方法自动被调用 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { System.out.println("run readExternal"); Date d = (Date) in.readObject(); System.out.println(d); this.serialClassInt = in.readInt(); } } /** * 序列化对象 */ public static void serializable(String fileName) throws Exception{ ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName)); MyClassControl my1 = new MyClassControl(); out.writeObject(my1); out.close(); } /** * 反序列化 */ public static void deserializable(String fileName)throws Exception{ ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); MyClassControl my2 = (MyClassControl)in.readObject(); my2.show(); in.close(); } public static void main(String[] args) throws Exception{ String fileName = "c:/temp/MyClassControl.ser"; SerializeControl.serializable(fileName); SerializeControl.deserializable(fileName); } }