Scala Enumeration和readResolve

时间:2009-09-03 09:15:51

标签: scala enums

Scala的Enumeration类和Enumeration.Val readResolve方法似乎无法正常工作(可能与this entry in Scala trac相关)。以下是* Steve Bendiola提供的一个程序,用于说明问题:

@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 个答案:

答案 0 :(得分:1)

Scala将hashCodeValue的{​​{1}}基于为其创建的唯一数字ID。它们不可序列化。您可以强制使用数值:

Enumeration

这应该生成枚举的序列化版本,但请注意,这些值与任何其他枚举之间可能存在冲突。

但未经测试。