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