办法:1、implements Serializable
2、想保存对象的类增加两方法:
1》private void writeObject(ObjectOutputStream stream)
2》private void readObject(ObjectInputStream stream)
上面方法是私有,只有自己的类里面的其它成员调用:技术反射和override。
怎么能被外部类ObjectOutputStream 的 writeObject,ObjectInputStream 的 readObject调用呢?
第一:ObjectOutputStream 类里 enableOverride=true(子类可以重写writeObject对象)
建立ObjectOutputStream 对象,需要保存类的对象。
当执行writeObject()方法时,使用反射技术查询需要保存类---是否有writeObject方法----有,则设置ObjectOutputStream 类里 enableOverride=true
---就开始执行保存类的writeObject()---继续执行ObjectOutputStream writeObject()。
package io;
import java.io.*;
public class SerialCtl implements Serializable {
private String a;
private transient String b;
public SerialCtl(String aa, String bb) {
a = "Not Transient: " + aa;
b = "Transient: " + bb;
}
public String toString() {
return a + "\n" + b;
}
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.defaultWriteObject();
stream.writeObject(b);
}
private void readObject(ObjectInputStream stream) throws IOException,
ClassNotFoundException {
stream.defaultReadObject();
b = (String) stream.readObject();
}
public static void main(String[] args) throws IOException,
ClassNotFoundException {
SerialCtl sc = new SerialCtl("Test1", "Test2");
System.out.println("Before:\n" + sc);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(buf);
o.writeObject(sc);
// Now get it back:
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
buf.toByteArray()));
SerialCtl sc2 = (SerialCtl) in.readObject();
System.out.println("After:\n" + sc2);
}
}