public static void main(String[] args) throws IOException,
ClassNotFoundException {
SerialCtl sc = new SerialCtl("Test1", "Test2");
System.out.println("Before: " + sc);
FileOutputStream buf = new FileOutputStream("x.tmp");
// ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(buf);
o.writeObject(sc);
o.flush();
o.close();
// Now get it back:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("x.tmp"));
// ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
SerialCtl sc2 = (SerialCtl) in.readObject();
System.out.println("After: " + sc2);
}
}
完全定制序列化过程:
如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.类实现Externalizable时,头写入对象流中,然后类完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。这里要注意了。声明类实现Externalizable接口会有重大的安全风险。writeExternal()与readExternal()方法声明为public,恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息,则要格外小心。这包括使用安全套接或加密整个字节流。
假如你需要序列化一个类Test:
import java.io.*;
class Test implements Externalizable{ //Test类必须实现Externalizable接口
private String letterstates = "fanruijun";
private int num = 0;
public Test(){
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(letterstates);
out.write(88); //在序列化的数据最后加个88
}