Класс Scala Enumeration
и метод Enumeration.Val
readResolve
не работают, как они должны делать (возможно, связаны с this entry in Scala trac). Вот программа предоставляется * Стив Bendiola», чтобы проиллюстрировать эту проблему:Scala Перечисление и чтениеResolve
@serializable
object InvestmentType extends Enumeration {
val Debt = Value("DEBT")
val Future = Value("FUTURE")
val Equity = Value("EQUITY")
}
Теперь Main
класс, который может работать либо с arument W
, где он будет выписывать значение перечисления в файл, или R
где он будет читать их обратно:
object Main {
def main(args: Array[String]) = {
args(0) match {
case "R" => {
val ois = new ObjectInputStream(new FileInputStream("enum.ser"))
var obj: Object = null
foreach(ois) { obj =>
obj match {
case InvestmentType.Debt => println("got " + obj)
case InvestmentType.Equity => println("got " + obj)
case InvestmentType.Future => println("got " + obj)
case _ => println("unknown: " + obj + " of: " + obj.getClass)
}
}
}
case "W" => {
val oos = new ObjectOutputStream(new FileOutputStream("enum.ser"))
InvestmentType.foreach {i => oos.writeObject(i)}
oos.flush
oos.close
}
}
}
Оба эти методы требуют этого foreach
метода:
def foreach(os: ObjectInputStream)(f: Object => Unit) {
try {
val obj = os.readObject
if (obj != null) {
f(obj)
foreach(os)(f)
}
} catch {
case e: EOFException => //IGNORE
}
}
}
Вывод этой программы, безусловно, должны не выглядеть:
got DEBT
unknown: FUTURE of: class scala.Enumeration$Val
unknown: EQUITY of: class scala.Enumeration$Val
Это, как представляется, связано с какой последовательности перечисления значения объявляются. Упорядочивание их, кажется, что первое значение всегда разумно решен
Daniel - как я уже упоминал в списке рассылки Scala, проблема не имеет * ничего, кроме * hashCode'. Я просто использую 'identityHashCode' значений Enumeration в одной JVM, чтобы показать, что метод' readResolve' в классе 'Enumeration.Val' работает некорректно –
Вопрос слишком прост для вас. :-) Да я видел это. –