public class Unicycle implements Serializable {
private static final long serialVersionUID = 3843396491741625744L;
private Wheel wheel;
public Unicycle( Wheel wheel ) {
this.wheel = wheel;
}
public String toString() {
return "Unicycle with " + wheel;
}
}
public class Wheel {
private static final long serialVersionUID = -8786651610841969855L;
private int wheelSize;
public Wheel( int ws ) {
wheelSize = ws;
}
public String toString() {
return "wheel size: " + wheelSize;
}
}
public class Main {
public static void main(String args[]) throws IOException, ClassNotFoundException {
Main main = new Main();
main.writeData();
main.readData();
}
public void writeData() throws IOException {
FileOutputStream outputFile = new FileOutputStream("storage.dat");
ObjectOutputStream outputStream = new ObjectOutputStream(outputFile);
Wheel wheel = new Wheel(65);
Unicycle uc = new Unicycle(wheel);
System.out.println("Before writing: " + uc);
outputStream.writeObject(uc);
outputStream.flush();
outputStream.close();
}
public void readData() throws IOException, ClassNotFoundException {
FileInputStream inputFile = new FileInputStream("storage.dat");
ObjectInputStream inputStream = new ObjectInputStream(inputFile);
Unicycle uc = (Unicycle) inputStream.readObject();
System.out.println("After reading: " + uc);
inputStream.close();
}
}
Perform 2 tasks in order to get this fix:
- The Wheel class has to be declared as transient in Unicycle class. (Note)
- Implement private void writeObject(ObjectOutputStream) and private void readObject(ObjectInputStream) in Unicycle class.
Note that these 2 methods isn't part of any interface, and accessible by the JVM even though it is declared as private. Below is the sample code of Unicycle class that implement these 2 methods:
public class Unicycle implements Serializable {
...
transient private Wheel wheel;
private void writeObject(ObjectOutputStream oos) {
try {
oos.defaultWriteObject();
oos.writeInt(wheel.getWheelSize());
}
catch( IOException e ) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream ois) {
try {
ois.defaultReadObject();
int wheelSize = ois.readInt();
wheel = new Wheel(wheelSize);
}
catch( IOException e ) {
e.printStackTrace();
}
catch( ClassNotFoundException e ) {
e.printStackTrace();
}
}
}
This is what JAVA called Customizing Serialization.

No comments:
Post a Comment