在scala中序列化优先级队列

时间:2013-04-03 14:53:28

标签: scala serialization priority-queue

我正在尝试在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应该是可序列化的,我能做些什么来解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

这应该被报告为错误 - 修复只是让嵌套的ResizableArrayAccess类继承Serializable

从技术上讲,也许您可​​以使用反射删除优先级队列类中private字段上的finalresarr修饰符,然后在序列化之前将其设置为null

否则,在序列化之前将优先级队列转换为数组,反之亦然,反之亦然,可以避免此异常。您可以在PriorityQueue周围使用自己的包装器来实现自定义序列化/反序列化。

注意:此问题已在Scala 2.11.0-M7中解决(SI-7568