不可序列化的特征

时间:2014-11-13 04:50:05

标签: scala apache-spark

我想禁用特征的序列化,以便扩展此特征的所有类在序列化时都会失败。

我如何在Scala中实现这一目标?

我使用spark,我需要这个,因为类会很大,序列化会导致性能下降,所以我想防止它被错误地序列化。

1 个答案:

答案 0 :(得分:4)

这是我的解决方案:

trait NonSerializable extends java.io.Externalizable {

  def writeExternal(out: java.io.ObjectOutput): Unit = {
    throw new UnsupportedOperationException(getClass() + " is not Serializable")
  }

  def readExternal(in: java.io.ObjectInput): Unit = {
    throw new UnsupportedOperationException(getClass() + " is not Serializable")
  }
}

case class Foo(s: String) extends NonSerializable {
}

object Foo extends App {
  val bytes = new java.io.ByteArrayOutputStream
  val out = new java.io.ObjectOutputStream(bytes)
  out.writeObject(Foo("bar"))
}

使用Externalizable在序列化中注入异常。子类不应覆盖readExternalwriteExternal

注意:NonSerializable违反了Serializable的合同。我不确定它是否可以根据Serializable的合同与其他图书馆合作。