1

所以我有一个像这样的对象

case class QueryResult(events: List[Event])

我需要序列化反序列化。对于序列化,我有这个隐式类

  implicit class Serializer(obj: Object) {
    def serialize: Array[Byte] = {
      val stream = new ByteArrayOutputStream()
      val objectOutputStream = new ObjectOutputStream(stream)
      objectOutputStream.writeObject(obj)
      objectOutputStream.close
      stream.toByteArray
    }
  }

它像

val byteArray = QueryResult(events).serialize

然后对于反序列化,我有这个可以由同伴类扩展的特征。

trait Deserializer[A] {
  private type resultType = A
  def deserialize(bytes: Array[Byte]): A = {
    val objectInputStream = new ObjectInputStream(
      new ByteArrayInputStream(bytes)
    )
    val value = objectInputStream.readObject.asInstanceOf[resultType]
    objectInputStream.close
    value
  }
}

你会这样使用它

object QueryResult extends Deserializer[QueryResult]

然后你应该能够QueryResult像这样从字节数组重建一个实例

val QueryResult: QueryResult = QueryResult.deserialize(byteArray)

问题是这有时会导致如下错误

java.lang.ClassCastException: cannot assign instance of scala.collection.generic.DefaultSerializationProxy to field co.app.QueryResult.events of type scala.collection.immutable.List in instance of co.app.QueryResult
  at java.base/java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2205)
  at java.base/java.io.ObjectStreamClass$FieldReflector.checkObjectFieldValueTypes(ObjectStreamClass.java:2168)
  at java.base/java.io.ObjectStreamClass.checkObjFieldValueTypes(ObjectStreamClass.java:1422)
  at java.base/java.io.ObjectInputStream.defaultCheckFieldValues(ObjectInputStream.java:2450)
  at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2357)
  at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2166)
  at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1668)
  at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:482)
  at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:440)
  at co.app.Deserializer.deserialize(Types.scala:51)
  at co.app.Deserializer.deserialize$(Types.scala:47)
  at co.app.LocalStorage$QueryResults$.get(LocalStorage.scala:241)
  ... 36 elided

现在,当我说有时我的意思是当我将代码组装到一个 jar 中并使用javacli 运行它时,反序列化会起作用,但是当我尝试通过 、 或 执行该代码时它sbt testsbt console中断ammonite。知道为什么它在这些情况下会中断以及可能的修复建议吗?

4

0 回答 0