简体   繁体   中英

Can you override the stream writers in scala @serializable objects?

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?

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 = // ...

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!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM