2016-11-15 2 views
0

Я пытаюсь выполнить двоичную сериализацию сложного объекта класса case, который продолжал бросать странное исключение. Я не совсем понимаю, что не так с этим примером, который вызывает следующее исключение. Я использовал это исключение для круговых ссылок, что здесь не так. Некоторые подсказки, пожалуйста?Серийная реализация класса Scala

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) 

Вот код

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] 
    } 
} 
+0

Ваш код хорошо работает для меня, без исключения, для печати «true» для обеих проверок. Я использую Scala 2.11.8. –

+0

да действительно. с scalac он работает правильно. он терпит неудачу только с sbt ... weird –

+0

В SBT у вас есть что-то вроде 'fork in Test: = true'? –

ответ

0

Замена списка с массивом, который неизменен тоже, устранена ли проблема. В моей первоначальной проблеме у меня была Карта, которую я заменил TreeMap.

Я думаю, что, вероятно, связано с реализацией прокси-шаблона в родовом неизменного Список и карта упоминается здесь:

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

Не могу поверить, что я потратил целый день на это.

Смежные вопросы