The java.io.Serializable is a relative easy kind of serialization. It only validates against serialVersionUID and doesn't allow you to load older/newer versions of your objects. This means that you render your saved data invalid with significant changed to your objects.
Another approach is to save your objects in XML form. But such implementation can become tricky because you need to handle circle references. You might implement something like the following for all the classes you want to save:
public Element asXmlElement(Document doc) {
Element element = doc.createElement(this.getClass().getSimpleName());
element.setAttribute("class", this.getClass().getName());
element.setAttribute("id", this.getId().toString());
elements.put(this.getId(), element);
// add more properties here... either as child nodes or attributes!
// i.e. element.appendChild(referencedObj.asXmlElement(doc));
return element;
}
Calling this method recursivly on your object graph can possibly end in an endless loop. You need to handle that (i.e. by managing a reference list of already handled objects and embedding refID elements in the XML structure).
By adding a version attribute to your XML nodes you could manage loading different versions of your object data. You need to implement some kind of Exporter/Importer classes that are able to use those methods. Of course you need the opposite method to asXmlElement... something like fromXmlNode(Node node) that decodes the data into the object.
This is only one possible approach.