Java 序列化TypeTags时是什么导致ClassCastException的? 处境

Java 序列化TypeTags时是什么导致ClassCastException的? 处境,java,scala,serialization,jvm,Java,Scala,Serialization,Jvm,我正在序列化此类的一个实现: abstract class FnDescriptor[T <: FnRequest: TypeTag, R <: FnResponse: TypeTag] with Serializable { override type Input = T override type Output = R override type State = S val inputTag: TypeTag[Input] = implicitly[T

我正在序列化此类的一个实现:

abstract class FnDescriptor[T <: FnRequest: TypeTag, R <: FnResponse: TypeTag] with Serializable {

  override type Input  = T
  override type Output = R
  override type State  = S

  val inputTag: TypeTag[Input]   = implicitly[TypeTag[T]]
  val outputTag: TypeTag[Output] = implicitly[TypeTag[R]]

}

与…比较您可能有类似的问题,也就是说,它可能是之前发生的异常的后续,或者您有一个循环对象图。对象替换和循环图不能很好地结合在一起。这是序列化框架的一个基本限制。这很可能是原因。但这意味着类型标签不是“可共享的”。当另一个JVM从未见过某个类时,应该如何与另一个JVM共享该类定义?这不是TypeTags的问题。首先,您必须确定问题的原始原因。例如,使用调试器识别在
ClassCastException
之前引发和捕获的所有异常。
java.lang.ClassCastException: cannot assign instance of scala.reflect.api.SerializedTypeTag to field com.package.structure.FnDescriptor.inputTag of type scala.reflect.api.TypeTags$TypeTag in instance of com.package.structure.FnDescriptor$$anon$1
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2287)
    at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1417)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2293)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1975)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
    at com.package.structure.gateway.GatewayService$$anonfun$1$$anonfun$apply$2$$anonfun$apply$3$$anonfun$apply$4.apply(GatewayService.scala:76)