有没有办法确保在编译时类型是Serializable

Upi*_*pio 6 scala shapeless

我经常使用Spark,如果编译器可以确保类型可序列化,它将节省我很多时间.

也许有一个类型?

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

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

我认为如果没有密封类型,这在编译时可能是不可能的.

Mil*_*bin 4

是的,这是可能的,但不是以您希望的方式。您的类型类IsSerializable可以提供一种机制,将您的类型转换为保证可以再次转换T的类型值,Serializable

trait IsSerializable[T] {
  def toSerializable(t: T): String
  def fromSerializable(s: String): Option[T]
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,这本身只是一种基于类型类的序列化机制的替代方案,使得 JVM 序列化的使用变得多余。

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