如何将SerialVersionUID添加到Scala中的Class [_]实例?

时间:2013-06-29 23:42:32

标签: scala serialization deserialization javassist bytecode-manipulation

我需要创建一个java.lang.Class实例的实例,该实例与classOf[MyClass]完全相同,但也有一个SerialVersionUID MyClass没有。 MyClass是Scala-2.10类。一个问题是,在Scala SerialVersionUID中,static finalSerialVersionUID,因为Scala没有静态。

如果MyClass是Java类,我想我可以使用Javassist来做到这一点:

  val ctclass = javassist.ClassPool.getDefault().get("mypackagage.MyClass")
  val field = javassist.CtField.make(
      "private static final long serialVersionUID = 1L;",
      ctclass)
  ctclass.addField(field)
  val cls = ctclass.toClass()

但是,这对Scala类来说并不安静。我试图在ClassLoader中使用它来进行反序列化。 反序列化期间没有编译或运行时错误,但反序列化的对象不完整,因此必须有一些更微妙的问题。详细描述了血腥细节here。据推测,问题来自Scala中如何处理static final字段以及Javassist只能理解的事实 Java的。我怎么能这样做,所以使用Javassist或任何其他方法对Scala类100%正确。

1 个答案:

答案 0 :(得分:2)

如果我编译以下类:

@SerialVersionUID(1L)
object MyClass {
}

$ scalac MyCLass.scala

$ javap -cp MyClass $

Compiled from "MyClass.scala"
public final class MyClass$ {
  public static final MyClass$ MODULE$;
  public static final long serialVersionUID;
  public static {};
}

我不熟悉javaassist,但是这显示了你需要放置附加字段FWIW的位置。