Shapeless ToTraversable 不可序列化
Shapeless ToTraversable is not serialisable
我正在尝试在 Spark RDD
中使用来自 Shapeless 的 HList
,我想使用需要以下隐式的 toList
方法:
implicit ev2: ToTraversable.Aux[InType, List, OutType]
但是,如果我将此隐式传递给 RDD,它会抛出 NotSerializableException
:
Caused by: java.io.NotSerializableException: scala.collection.generic.GenTraversableFactory$$anon
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
是否有其他方法可以在 Shapeless 中实现 toList
,或者提供可序列化的隐式方法?
阅读 tests 中的一些无形代码后,解决方法是将此隐式 CanBuildFrom
置于 ToTraversable
的范围内:
implicit def listSerializableCanBuildFrom[T]: CanBuildFrom[List[T], T, List[T]] =
new CanBuildFrom[List[T], T, List[T]] with Serializable {
def apply(from: List[T]) = from.genericBuilder[T]
def apply() = List.newBuilder[T]
}
我正在尝试在 Spark RDD
中使用来自 Shapeless 的 HList
,我想使用需要以下隐式的 toList
方法:
implicit ev2: ToTraversable.Aux[InType, List, OutType]
但是,如果我将此隐式传递给 RDD,它会抛出 NotSerializableException
:
Caused by: java.io.NotSerializableException: scala.collection.generic.GenTraversableFactory$$anon
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
是否有其他方法可以在 Shapeless 中实现 toList
,或者提供可序列化的隐式方法?
阅读 tests 中的一些无形代码后,解决方法是将此隐式 CanBuildFrom
置于 ToTraversable
的范围内:
implicit def listSerializableCanBuildFrom[T]: CanBuildFrom[List[T], T, List[T]] =
new CanBuildFrom[List[T], T, List[T]] with Serializable {
def apply(from: List[T]) = from.genericBuilder[T]
def apply() = List.newBuilder[T]
}