I now understand that scala @serializable objects can be used the same as a Java Serializable object. In a Java Serializable object there are methods you can override to change how the object streams: writeObject(ObjectOutputStream) / readObject(ObjectOutputStream).
Can you override or inject methods into a scala @serializable object allowing you to change how the object serializes?
To be stored in an Object Stream, each object must implement either the Serializable or the Externalizable interface: For a Serializable class, Object Serialization can automatically save and restore fields of each class of an object and automatically handle classes that evolve by adding fields or supertypes.
The ObjectInputStream class contains readObject() method for deserializing an object.
If our class does not implement Serializable interface, or if it is having a reference to a non- Serializable class, then the JVM will throw NotSerializableException . All transient and static fields do not get serialized.
Serializable interface has two methods, readResolve() and writeReplace() , which are used to read and write object in database.
As already stated, you can define your own writeObject and readObject methods.
@throws(classOf[java.io.IOException])
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition here */
However be careful when performing this on nested classes, objects or traits.
@serializable class Foo(x : Int) { @serializable object X { def y = x } }
If I serialize object X, it will actually serialize the containing Foo class, so this must also be serializable. This can be a PITA to deal with in custom serialization methods, so here's fair warning.
Another pain-point can be closure serialization. Try to keep a mental model of what variables are being captured in serialized closures. Ensure that these variables are something you'd want sent over IO!
Yes, you can use the same methods in Scala as in Java:
@throws(classOf[IOException])
private def writeObject(out: ObjectOutputStream): Unit = // ...
@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With