【问题标题】:Can you override the stream writers in scala @serializable objects?您可以覆盖 scala @serializable 对象中的流编写器吗?
【发布时间】:2015-11-17 15:58:10
【问题描述】:

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

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

【问题讨论】:

  • 谢谢!我弄错了方法的签名。

标签: serialization scala serializable


【解决方案1】:

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

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

@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...

【讨论】:

  • readObject 返回单位。什么是创建对象的示例实现?鉴于它是实例上的一种方法? java中的例子都是调用this.someProperty来赋值。这在 scala 中如何在案例类上使用不可变的 vals 工作?
  • @ScottSmith 我怀疑你在使用可变字段或一些非常讨厌的反射技巧时被卡住了。
  • @ScottSmith ... 或者使用writeReplace and readResolve 方法。
【解决方案2】:

如前所述,您可以定义自己的 writeObject 和 readObject 方法。

@throws(classOf[java.io.IOException])
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition  here */

但是在嵌套类、对象或特征上执行此操作时要小心。

@serializable 类Foo(x:Int){ @serializable 对象 X { def y = x } }

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

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

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2018-03-13
    • 2021-05-23
    • 2010-12-17
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多