Scala Pickling 的使用:MyObject -> Array[Byte] -> MyObject

5
我正在尝试学习在ScalaDays 2013上展示的新Scala Pickling库:Scala Pickling
我真正需要的是一些简单的示例来了解如何使用该库。
我理解我可以像这样pickle和unpickle某个对象:
import scala.pickling._

val pckl = List(1, 2, 3, 4).pickle
val lst = pckl.unpickle[List[Int]]

在这个例子中,pckl是Pickel类型。那么,这种类型的用途是什么,我如何获取它的Array[Byte]呢?
1个回答

6
如果你想将pickle转换为字节,那么代码看起来会像这样:

如果您想将pickle转换为字节,则代码如下:

import scala.pickling._
import binary._         
val pckl = List(1, 2, 3, 4).pickle
val bytes = pckl.value

如果你需要 JSON,代码几乎一样,只需稍作修改导入的内容即可:
import scala.pickling._
import json._         
val pckl = List(1, 2, 3, 4).pickle
val json = pckl.value

对象的序列化方式取决于您在 scala.pickling 下选择的导入类型(可以是 binaryjson)。如果选择了 binary,则 value 属性将是一个 Array[Byte]。如果选择了 json,那么它将是一个 json String


2
没错,cmbaxter是完全正确的。腌制表示的类型是Pickle的子类型。从腌制表示中选择value会给你期望的类型,例如二进制的Array[Byte],JSON的String等。 - Heather Miller
谢谢您的回答。有时Scala会隐式地做一些事情,这让我感到困惑。我还习惯于Java更明确的语法,但我正在努力适应Scala的语法。 ;) - Björn Jacobs
1
IntelliJ 不理解使用哪种类型,这可能是真的吗?我导入了 scala.pickling._ 和 binary._,当我在一个对象上调用 .pickle 时,IntelliJ 告诉我它是 Pickle 类型,而不是 BinaryPickle。因此,它告诉我 .value 是 Pickle.this.type#ValueType 类型。编译器没有抱怨,对于它来说结果类型是 BinaryPickle。我的解决方法:现在调用 .pickle.asInstanceOf[BinaryPickle],这样它就不会在 IDE 中显示错误了。 - Björn Jacobs
1
非常好的观点,感谢您提出。几天前,我们引入了一个修复程序,我们认为应该解决IntelliJ的这个问题。简而言之,在pickling框架中使用的宏现在具有更精确的类型签名,应该被IntelliJ捕获,而无需扩展宏。如果您继续遇到问题,请告诉我们! - Heather Miller
1
我希望主页上的文档以更易于阅读的形式提供,而不是针对大学世界的繁琐PDF文件。 Pickling可以是一个不错的库,但在这一点上我发现它非常缺乏。 - user1338062

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接