我正在尝试在scala(2.10)中序列化可变PriorityQueue
,并在将对象写入ObjectOutputStream时获得NotSerializableException
。我做了一个简单的测试用例:
import java.io.{ByteArrayOutputStream, ObjectOutputStream}
import scala.collection.mutable
object Test extends App {
val pq = new mutable.PriorityQueue[Int]()
val oos = new ObjectOutputStream(new ByteArrayOutputStream())
oos.writeObject(pq)
}
例外是
Exception in thread "main" java.io.NotSerializableException:scala.collection.mutable.PriorityQueue$ResizableArrayAccess
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at Test$.main(Test.scala:7)
似乎PriorityQueue应该是可序列化的,我能做些什么来解决这个问题吗?
答案 0 :(得分:3)
这应该被报告为错误 - 修复只是让嵌套的ResizableArrayAccess
类继承Serializable
。
从技术上讲,也许您可以使用反射删除优先级队列类中private
字段上的final
和resarr
修饰符,然后在序列化之前将其设置为null
否则,在序列化之前将优先级队列转换为数组,反之亦然,反之亦然,可以避免此异常。您可以在PriorityQueue
周围使用自己的包装器来实现自定义序列化/反序列化。
注意:此问题已在Scala 2.11.0-M7中解决(SI-7568)