gpt4 book ai didi

scala - Scala枚举和readResolve

转载 作者:行者123 更新时间:2023-12-02 04:18:23 25 4
gpt4 key购买 nike

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

似乎与枚举值的声明顺序有关。重新排序它们,似乎总是明智地解决了第一个值

最佳答案

Scala将其hashCode类的每个ValueEnumeration基于为其创建的唯一数字ID。它们不可序列化。您可以强制使用数值:

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

这应该产生枚举的序列化版本,但请注意,这些值和任何其他枚举之间可能会发生冲突。

不过未经测试。

关于scala - Scala枚举和readResolve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1372346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com