我经常使用Spark,如果编译器能够确保类型是可序列化的,那将为我节省很多时间。
可能是一个类型类?
def foo[T: IsSerializable](t: T) = {
// do stuff requiring T to be serializable
}
仅仅约束T <: Serializable是不够的。它仍然可能在运行时失败。单元测试是一个很好的替代,但是你仍然可以忘记它们,特别是在与大型团队一起工作时。
我认为如果不对类型进行密封,在编译时这可能是不可能做到的。
是的,这是可能的,但不是以你希望的方式。您的类型类IsSerializable
可以提供一种机制,将您的T
转换为是保证为Serializable
的类型的值,然后再返回
trait IsSerializable[T] {
def toSerializable(t: T): String
def fromSerializable(s: String): Option[T]
}
但是,当然,这只是另一种基于类型类的序列化机制,使JVM序列化的使用变得多余。
你最好的做法是游说Spark直接支持基于类型类的序列化。