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.