我试图使用Scala Pickling来编写一些通用的unpickling逻辑。
假设您有两种类型,A和B,并将它们腌制成字节数组。
您接受此字节数组并将其发送到另一台计算机,并将其作为字节数组接收。
现在你需要解开它,但你不知道字节数组是用于类型A还是类型B.
您如何编制取消部分?你是否让A和B扩展另一种类型,比如T,然后调用unpickle [T],然后对A或B的结果进行模式匹配?
或者你是否向T添加一个实例变量,比如一个Byte,它对A或B类型的实例使用不同的数字,并根据它,调用unpickle [A]或unpickle [B]?
更新:看看Scala Pickling测试套件,我发现最接近的是base.scala,它跟随第一个选项。
答案 0 :(得分:0)
以下通过打印工作:
It's A
It's B
代码:
import scala.pickling._
import binary._
object MultiTypePickling extends App {
sealed abstract class Base
final class A extends Base { override def toString = "A" }
final class B extends Base { override def toString = "B" }
val a = new A
val pa = a.pickle
val b = new B
val pb = b.pickle
// ----
pa.value.unpickle[Base] match {
case aa: A =>
println("It's " + aa)
case _ =>
assert(assertion = false)
}
pb.value.unpickle[Base] match {
case bb: B =>
println("It's " + bb)
case _ =>
assert(assertion = false)
}
}