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

时间:2016-09-02 07:05:28

标签: scala shapeless

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

也许是类型类?

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

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

我认为如果没有密封类型,在编译时可能无法做到这一点。

1 个答案:

答案 0 :(得分:4)

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

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

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

您最好的行动方案是游说Spark直接支持基于类型的序列化。