2013-04-03 61 views
1

我想在scala(2.10)中序列化一個可變的PriorityQueue,並在將對象寫入ObjectOutputStream時獲得一個NotSerializableException。我做了一個簡單的測試案例:在scala中序列化一個優先級隊列

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應該是序列化的,是有什麼我可以做些什麼來解決這個問題?

回答

3

這應該被報告爲一個錯誤 - 修復方法是簡單地使嵌套的ResizableArrayAccess類繼承Serializable

從技術上講,也許你可以使用反射來去除privatefinal改性劑對resarr領域的優先級隊列,然後將其序列化之前設置爲null

否則,在序列化之前將優先級隊列轉換爲數組,而在反序列化中將數組轉換爲反之亦然可以避免此異常。你可以在你自己的包裝器中使用PriorityQueue來實現自定義序列化/反序列化。

注意:這個問題在斯卡拉得到解決2.11.0-M7(SI-7568

+0

現在,我使用自定義序列轉換到一個數組和背部,我將提交錯誤報告,以及。謝謝 – Kyprus