Selective Serialization
As noted earlier, static fields are not serialized, as these are not part of the state of an object. An instance field of an object can be omitted from being serialized by specifying the transient modifier in the declaration of the field—typically used for sensitive data in a field. Selective serialization discussed here is not applicable to record classes.
Example 20.7 illustrates some salient aspects of serialization. The setup comprises the classes Wheel and Unicycle, and their client class SerialClient. The class Unicycle has a field of type Wheel, and the class Wheel has a field of type int. The class Unicycle is a compound object with a Wheel object as a constituent object. The class Serial-Client serializes and deserializes a unicycle in the try-with-resources statements at (4) and (5), respectively. The state of the objects is printed to the standard output stream before serialization, and so is the state of the object created by deserialization.
Both the Compound Object and Its Constituents Are Serializable
If we run the program with the following declarations for the Wheel and the Unicycle classes, where a compound object of the serializable class Unicycle uses an object of the serializable class Wheel as a constituent object:
class Wheel implements Serializable { // (1a)
private int wheelSize;
…
}
class Unicycle implements Serializable { // (2)
private Wheel wheel; // (3a)
…
}
we get the following output, showing that both serialization and deserialization were successful:
Before writing: Unicycle with wheel size: 65
After reading: Unicycle with wheel size: 65
A compound object with its constituent objects is often referred to as an object graph. Serializing a compound object serializes its complete object graph—that is, the compound object and its constituent objects are recursively serialized.
Example 20.7 Non-Serializable Objects
import java.io.Serializable;
// public class Wheel implements Serializable { // (1a)
public class Wheel { // (1b)
private int wheelSize;
public Wheel(int ws) { wheelSize = ws; }
@Override
public String toString() { return “wheel size: ” + wheelSize; }
}
import java.io.Serializable;
public class Unicycle implements Serializable { // (2)
private Wheel wheel; // (3a)
//transient private Wheel wheel; // (3b)
public Unicycle (Wheel wheel) { this.wheel = wheel; }
@Override
public String toString() { return “Unicycle with ” + wheel; }
}
import java.io.*;
public class SerialClient {
public static void main(String args[])
throws IOException, ClassNotFoundException {
try (// Set up the output stream: // (4)
FileOutputStream outputFile = new FileOutputStream(“storage.dat”);
ObjectOutputStream outputStream = new ObjectOutputStream(outputFile)) {
// Write the data:
Wheel wheel = new Wheel(65);
Unicycle uc = new Unicycle(wheel);
System.out.println(“Before writing: ” + uc);
outputStream.writeObject(uc);
}
try (// Set up the input streams: // (5)
FileInputStream inputFile = new FileInputStream(“storage.dat”);
ObjectInputStream inputStream = new ObjectInputStream(inputFile)) {
// Read data.
Unicycle uc = (Unicycle) inputStream.readObject();
// Write data on standard output stream.
System.out.println(“After reading: ” + uc);
}
}
}