有没有办法确保类型在编译时是可序列化的
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 的序列化。
我经常使用 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 的序列化。