简体   繁体   English

Scala Case类序列化

[英]Scala Case Class serialization

I've been trying to binary serialize a composite case class object that kept throwing a weird exception. 我一直在尝试对组合案例类对象进行二进制序列化,该对象不断抛出奇怪的异常。 I don't really understand what is wrong with this example which throws the following exception. 我并不真正理解此示例抛出了以下异常的问题所在。 I used to get that exception for circular references which is not the case here. 我以前是通过循环引用来获取该异常的,这里不是这种情况。 Some hints please? 请问一些提示吗?

java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field com.Table.rows of type scala.collection.immutable.List in instance of com.Table
java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field com.Table.rows of type scala.collection.immutable.List in instance of com.Table
    at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2133)
    at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2024)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
    at com.TestSeri$.serializeBinDeserialise(TestSeri.scala:37)
    at com.TestSeri$.main(TestSeri.scala:22)
    at com.TestSeri.main(TestSeri.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

Here is the code 这是代码

import java.io._    
import scalax.file.Path

case class Row(name: String)
case class Table(rows: List[Row])
case class Cont(docs: Map[String, Table])

case object TestSeri {
  def main(args: Array[String]) {
    val cc = Cont(docs = List(
      "1" -> Table(rows = List(Row("r1"), Row("r2"))),
      "2" -> Table(rows = List(Row("r301"), Row("r31"), Row("r32")))
    ).toMap)

    val tt = Table(rows = List(Row("r1"), Row("r2")))
    val ttdes = serializeBinDeserialize(tt)
    println(ttdes == tt)

    val ccdes = serializeBinDeserialize(cc)
    println(ccdes == cc)
  }

  def serializeBinDeserialize[T](payload: T): T = {
    val bos = new ByteArrayOutputStream()
    val out = new ObjectOutputStream(bos)
    out.writeObject(payload)

    val bis = new ByteArrayInputStream(bos.toByteArray)
    val in = new ObjectInputStream(bis)
    in.readObject().asInstanceOf[T]
  }
}

Replacing List with Array which is immutable too, fixed the problem. 用不可变的Array替换List也解决了这个问题。 In my original problem I had a Map which I replaced with TreeMap. 在我最初的问题中,我有一个Map,它被TreeMap取代。

I think is likely to be related to the proxy pattern implementation in generic immutable List and Map mentioned here: 我认为可能与此处提到的通用不可变List和Map中的代理模式实现有关:

https://issues.scala-lang.org/browse/SI-9237 . https://issues.scala-lang.org/browse/SI-9237

Can't believe I wasted a full day on this. 不敢相信我在这上浪费了一整天。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM