有没有办法确保类型在编译时是可序列化的

Is there a way to ensure a type is Serializable at compile time

我经常使用 Spark,如果编译器能够确保一个类型是可序列化的,那会为我节省很多时间。

也许类型 class?

def foo[T: IsSerializable](t: T) = {
  // do stuff requiring T to be serializable
}

仅仅限制 T <: Serializable 是不够的。它仍然可能在运行时失败。单元测试是一个很好的替代品,但您仍然可以忘记它们,尤其是在与大型团队合作时。

我认为如果不密封类型,这可能不可能在编译时完成。

是的,这是可能的,但不是您希望的那样。您的类型 class IsSerializable 可以提供一种机制将您的 T 转换为 保证 Serializable 的类型的值又回来了,

trait IsSerializable[T] {
  def toSerializable(t: T): String
  def fromSerializable(s: String): Option[T]
}

但是,当然,这只是一种基于class 的序列化机制的替代类型,它本身就不需要使用 JVM 序列化。

您最好的做法是游说 Spark 直接支持基于类型 class 的序列化。