2013-04-03 6 views
1

Я пытаюсь сериализовать изменяемый PriorityQueue в scala (2.10) и получаю NotSerializableException при записи объекта в ObjectOutputStream. Я сделал простой тест:Сериализация очереди приоритетов в 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.

Технически, может быть, вы могли бы использовать отражение для удаления private и final модификаторов на resarr поле в классе очереди приоритета, а затем установить его на null до десериализации.

В противном случае преобразование приоритетной очереди в a, скажем, в массив до сериализации и наоборот при десериализации, позволит избежать этого исключения. Вы можете перевернуть свою собственную обертку вокруг PriorityQueue для реализации пользовательской сериализации/десериализации.

Примечание: Эта проблема была решена в Scala 2.11.0-M7 (SI-7568)

+0

Я теперь с помощью пользовательских сериализации, чтобы преобразовать в массив и обратно, я подам отчет об ошибке, а также , благодаря – Kyprus

Смежные вопросы