1

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

4

1 回答 1

3

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

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

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

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

于 2013-04-03T15:05:38.260 回答