Java Serialization
Table of Contents
Java Object Serialization #
The specification can be found here for Java 11.
Serialization
interface #
If we simply inherit this interface we are declaring our class can be serialized.
class Car(val name : String) : Serializable
readObject
and writeObject
#
If we have these two methods on our class we can control how we serialize the class.
These are found via reflection and are not members of the Serialization
interface. We must implement exactly the signature:
private void writeObject(ObjectOutputStream stream)
throws IOException;
as per Section 2.3.
For example:
class Car(var name: String) : Serializable {
private fun writeObject(oos : ObjectOutputStream) {
println("Writing object")
oos.writeUTF(name)
}
private fun readObject(ois : ObjectInputStream) {
println("Reading object")
name = ois.readUTF()
}
}
Similarly, as above, readObject
method must have precisely the signature:
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException;
as per Section 3.4.
Then:
val car = Car("Ford")
println("Serialized Car is a ${car.name}")
val byteArrayOutputStream = ByteArrayOutputStream()
ObjectOutputStream(byteArrayOutputStream).use { oos ->
oos.writeObject(car)
oos.flush()
}
byteArrayOutputStream.flush()
val bytes = byteArrayOutputStream.toByteArray()
byteArrayOutputStream.close()
val byteArrayInputStream = ByteArrayInputStream(bytes)
ObjectInputStream(byteArrayInputStream).use {
val newCar = it.readObject() as Car
println("Deserialized Car is a ${newCar.name}")
}
byteArrayInputStream.close()
We then print to stdout
:
Serialized Car is a Ford
Writing object
Reading object
Deserialized Car is a Ford
The simple repository can be found here.