2009-09-03 8 views
3

ScalaのEnumerationクラスとEnumeration.ValreadResolveメソッドは、(おそらくthis entry in Scala tracに関連する)動作するようには見えません。ここで問題説明するため*スティーブBendiola」が提供するプログラムです。Scala EnumerationとreadResolve

@serializable 
object InvestmentType extends Enumeration { 
    val Debt = Value("DEBT") 
    val Future = Value("FUTURE") 
    val Equity = Value("EQUITY") 
} 

は今Mainそれがファイルに列挙値を書き出しますarument Wのいずれかで実行することができ、クラス、またはRそれは、再びに戻ってそれらを読み込みます:

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 
    } 
    } 
} 

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方法を必要としますこのプログラムの

出力は確かにない表情のようにする必要があります

got DEBT
unknown: FUTURE of: class scala.Enumeration$Val
unknown: EQUITY of: class scala.Enumeration$Val

列挙値が宣言されている注文した関連すると思われます。それらを並べ替えると、最初の値は常に分かりやすいように見えます。

答えて

1

スカラーは、Enumerationクラスの各ValuehashCodeを固有の数値に基づいています。それらはシリアライズ可能ではありません。あなたはこれらの値と、他の列挙の間の衝突を持っている可能性が

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

これは、列挙のserializaleバージョンを作るべき、しかし心:あなたは数値を強制することがあります。

しかし、未テストです。

+0

Daniel - Scala Userのメーリングリストで述べたように、問題は* hashCodeと何も関係ありません。私はちょうど単一のJVMでEnumeration値の 'identityHashCode'を使って' Enumeration.Val'クラスの 'readResolve'メソッドが正しく動作していないことを示しています –

+0

質問はあなたから来るのが簡単すぎました。 :-) はい私はそれを見ました。 –

関連する問題