当类型未知时取消

时间:2014-04-08 17:40:37

标签: scala scala-pickling

我试图使用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,它跟随第一个选项。

1 个答案:

答案 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)
  }

}