just take notes to 'discover the secrets of java serialization.
http://java.sun.com/developer/technicalArticles/Programming/serialization/
Default Mechanism:
Rule #1: The object to be persisted must implement the Serializable
interface or inherit that implementation from its object hierarchy.
to actually persist the object, use ObjectOutputStream.writeObject();
Nonserializable object:
when a field we don't want to serialize, e.g, thread, OutputStream, socket, follow the rules:
Rule #2: The object to be persisted must mark all nonserializable fields transient
Customize the protocol
when want to recover the state like thread, can use this:
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
Create your own protocol
you can implement Externalizable interface to build your own protocol
public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
Version Control
all persistent-capable classes are automatically given a unique identifier. The identifier that is part of all classes is maintained in a field called serialVersionUID
. If you wish to control versioning, you simply have to provide the serialVersionUID
field manually and ensure it is always the same, no matter what changes you make to the classfile.
The version control works great as long as the changes are compatible. Compatible changes include adding or removing a method or a field. Incompatible changes include changing an object's hierarchy or removing the implementation of the Serializable
interface. A complete list of compatible and incompatible changes is given in the Java Serialization Specification.