12.4 Serialization

When an instance is serialized in Java, the graph of instances reachable via non-transient fields is written to an output stream. In this context, non-transient refers to fields that have not been declared transient in Java. Java's transient fields and JDO's managed fields are independent concepts, so any combination of Java's transient or non-transient fields with JDO's persistent, transactional, or transient fields is possible in your persistent classes.

You can serialize and deserialize instances of your persistent classes. You do not need to do anything special for serialization to work. In fact, the JDO implementation automatically fetches the graph of instances, even if they have not yet been loaded into the JVM from the datastore.

However, you should be aware that the instances reachable from the instance being serialized might include a large number of instances from the datastore. If your persistent classes are highly interconnected, you may unintentionally serialize a large percentage of your datastore. You can use Java's transient modifier to prevent the serialization of referenced instances. Chapter 4 showed how to make Java transient fields persistent in JDO by setting the persistent-modifier attribute to "persistent". This lets you serialize persistent instances in JDO without extracting and serializing a large portion of the data from your datastore.

JDO enhancement allows you to serialize transient and persistent instances of persistent classes to a format that can later be deserialized with an enhanced or unenhanced form of the class. Deserializing a serialized graph of instances that are persistent in JDO results in a graph of transient instances. So, no JDO-specific functionality is necessary to deserialize the instances. Subsequently, you can make these instances persistent, but they will not have any association with the original persistent instances that were serialized.