我现在明白scala @serializable对象可以和Java Serializable对象一样使用。在Java Serializable对象中,您可以覆盖以更改对象流的方式:writeObject(ObjectOutputStream)/ readObject(ObjectOutputStream)。
您可以将方法覆盖或注入scala @serializable对象,以便更改对象序列化的方式吗?
答案 0 :(得分:9)
是的,您可以在Scala中使用与Java中相同的方法:
@throws(classOf[IOException])
private def writeObject(out: ObjectOutputStream): Unit = // ...
@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...
答案 1 :(得分:3)
如前所述,您可以定义自己的writeObject和readObject方法。
@throws(classOf[java.io.IOException])
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition here */
但是在嵌套的类,对象或特征上执行此操作时要小心。
@serializable class Foo(x:Int){ @serializable对象X {def y = x} }
如果我序列化对象X,它实际上会序列化包含的Foo类,所以这也必须是可序列化的。这可以是一个PITA来处理自定义序列化方法,所以这里是公平的警告。
另一个痛点可能是闭包序列化。尝试保持序列化闭包中捕获的变量的心理模型。确保这些变量是您希望通过IO发送的内容!