2009-09-03 5 views
3

Класс Scala Enumeration и метод Enumeration.ValreadResolve не работают, как они должны делать (возможно, связаны с 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

Это, как представляется, связано с какой последовательности перечисления значения объявляются. Упорядочивание их, кажется, что первое значение всегда разумно решен

ответ

1

Scala основывает hashCode каждого Value его Enumeration класса на уникальных числовых идентификаторов, созданных для них. Они не сериализуемы. Вы можете заставить числовое значение:

object InvestmentType extends Enumeration { 
    val Debt = Value(1, "DEBT") 
    val Equity = Value(2, "EQUITY") 
    val Future = Value(3, "FUTURE") 
} 

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

Невеста, однако.

+0

Daniel - как я уже упоминал в списке рассылки Scala, проблема не имеет * ничего, кроме * hashCode'. Я просто использую 'identityHashCode' значений Enumeration в одной JVM, чтобы показать, что метод' readResolve' в классе 'Enumeration.Val' работает некорректно –

+0

Вопрос слишком прост для вас. :-) Да я видел это. –

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