通用类型信息scala的序列化?

时间:2016-07-07 22:36:40

标签: java scala generics serialization

我在scala中使用许多表达式和运算符构建DSL,我想知道他们自己的类型。例如:

import scala.reflect.runtime.universe._

trait Expression[T] {
    def evaluate: T
    def evalType: scala.reflect.runtime.universe.Type  // represents T
}

我希望将类型信息用于各种目的(例如,打印表达式的类型,按结果类型过滤表达式,以及将Expression [_]的集合转换为某种类型或其他类型。我可以这样做(下面),但似乎不能保持泛型类型信息AND具有类型信息可序列化的属性。

我可以让类知道它们的类型参数,如下所示:

import scala.reflect.runtime.universe._

case class TypeAware[T:TypeTag](c:Type=null) {
  val typ:Type = if (c==null) typeOf[T] else c
}  

class RelectionUtilTest {

  @Test
  def serializeTypeTest(): Unit = {
    val obj = TypeAware[Seq[Int]]()
    println(obj.typ) // Seq[Int]
    val copy = SerializationUtil.copyBySerialization(obj)  // via ObjectOutputStream -> ObjectInputStream
    println(copy.typ)
  }
}

...但scala的Type字段不是Serializable。

或者我可以让班级知道T

的班级[_]
case class ClassAware[T:TypeTag](c:Class[_]=null) {
  val clz:Class[_] = if (c==null) runtimeMirror(this.getClass.getClassLoader).runtimeClass(typeOf[T].typeSymbol.asClass) else c
}

class RelectionUtilTest {

  @Test
  def serializeTypeTest(): Unit = {
    val obj = ClassAware[Seq[Int]]()
    println(obj.typ) // Seq[_]
    val copy = SerializationUtil.copyBySerialization(obj)
    println(copy.typ)
  }
}

但java类[_]被类型擦除: - (

那么,如何在scala中序列化泛型类型信息?

更新:序列化Java的ParameterizedType似乎是一个解决方案,但I don't see how to convert java ParameterizedType <-> scala Type

0 个答案:

没有答案