如何使用scala中的case序列/对象不可序列化?注释/特征/帮助者的工作原理

时间:2016-04-01 21:21:39

标签: scala serialization apache-spark

在scala中,我想禁用许多case类的Serializable特性,因为我希望这类对象永远不会被序列化并运送到分布式计算框架中的远程计算机(特别是Apache Spark),任何实现当包含它的任何闭包被序列化时,它应该触发显式的运行时异常。

我已经尝试了@transient + null检查,它在反序列化时触发了运行时异常(不是我想要的),并且错误信息非常混淆。有没有办法改善这个?

非常感谢您的建议!

1 个答案:

答案 0 :(得分:5)

您可以实现并混合禁用序列化的特征:

trait NotSerializable extends Serializable {
  private def writeObject(out: java.io.ObjectOutputStream): Unit = throw new NotSerializableException()
  private def readObject(in: java.io.ObjectInputStream): Unit = throw new NotSerializableException()
  private def readObjectNoData(): Unit = throw new NotSerializableException()
}

case class Test(foo: String) extends NotSerializable

尝试序列化会引发异常:

new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(Test("test"))
|-> java.io.NotSerializableException: A$A39$A$A39

但是,您确实需要案例类的哪些功能? 最简单的解决方案可能是不使用 案例类和对象。