序列化Scala中的一个优先级队列(Serializing a priority queue in

2019-08-19 06:53发布

我试图序列化一个可变PriorityQueue在斯卡拉(2.10)和我得到一个NotSerializableException写作对象一个ObjectOutputStream时。 我做了一个简单的测试案例:

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应该是序列化的,是有什么我可以做些什么来解决这个问题?

Answer 1:

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

从技术上讲,也许你可以使用反射来去除privatefinal的修饰resarr优先级队列类字段,然后将其设置为null序列化之前。

否则,优先级队列转换成,比方说,之前在反序列化序列化,反之亦然阵列将避免此异常。 你可以在各地自己的包装推出PriorityQueue实现自定义序列化/反序列化。

注意 :这个问题在斯卡拉得到解决2.11.0-M7( SI-7568 )



文章来源: Serializing a priority queue in scala