10

我现在明白 scala @serializable 对象可以与 Java Serializable 对象一样使用。在 Java Serializable 对象中,您可以覆盖一些方法来更改对象流的方式:writeObject(ObjectOutputStream) / readObject(ObjectOutputStream)。

您可以覆盖或将方法注入到 scala @serializable 对象中,从而允许您更改对象的序列化方式吗?

4

2 回答 2

10

是的,您可以在 Scala 中使用与 Java 中相同的方法:

@throws(classOf[IOException])
private def writeObject(out: ObjectOutputStream): Unit = // ...

@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...
于 2010-08-09T19:59:11.513 回答
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 object X { def y = x } }

如果我序列化对象 X,它实际上会序列化包含的 Foo 类,所以这也必须是可序列化的。这可以是在自定义序列化方法中处理的 PITA,所以这里是公平的警告。

另一个痛点可能是闭包序列化。尝试保持一个心理模型,了解在序列化闭包中捕获了哪些变量。确保这些变量是您希望通过 IO 发送的东西!

于 2010-08-11T01:49:31.727 回答