我希望能够使用scala pickling来存储案例类的二进制表示.
我想知道是否有办法管理案例类的版本控制(协议缓冲区允许的方式)
这是我的例子
我在某个日期创建一个程序,具有以下案例类
case class MessageTest(a:String,b:String)
Run Code Online (Sandbox Code Playgroud)
然后我序列化了这个类的一个实例
import scala.pickling._
import binary._
val bytes=MessageTest("1","2").pickle
Run Code Online (Sandbox Code Playgroud)
然后我将结果存储到一个文件中
稍后,我可能现在必须在我的case类上进行演化,添加一个新的可选字段
case class MessageTest (a:String,b:String,c:Option[String]=None)
Run Code Online (Sandbox Code Playgroud)
我希望能够重用我先前存储在我的文件中的数据,对其进行反序列化,并能够恢复案例类的实例(新参数的默认值)
但是当我使用以下代码时
import scala.pickling._
import binary._
val messageback=bytes.unpickle[MessageTest]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
java.lang.ArrayIndexOutOfBoundsException:26 at scala.pickling.binary.BinaryPickleReader $$ anonfun $ 2.apply(BinaryPickleFormat.scala:446)at scala.pickling.binary.BinaryPickleReader $$ anonfun $ 2.apply(BinaryPickleFormat.scala:434)at at scala.pickling.PickleTools $ class.withHints(Tools.scala:498)scala.pickling.binary.BinaryPickleReader.withHints(BinaryPickleFormat.scala:425)scala.pickling.binary.BinaryPickleReader.beginEntryNoTagDebug(BinaryPickleFormat.scala:434)在scala.pickling.binary.BinaryPickleReader.beginEntryNoTag(BinaryPickleFormat.scala:431)
我做错什么了吗 ?
是否存在使我的场景工作的现有方法?
问候
我正在尝试使用"pickling"序列化是Scala,我看到同样的例子演示它:
import scala.pickling._
import json._
val pckl = List(1, 2, 3, 4).pickle
Run Code Online (Sandbox Code Playgroud)
Unpickling就像酸洗一样简单:
val lst = pckl.unpickle[List[Int]]
Run Code Online (Sandbox Code Playgroud)
这个例子提出了一些问题.首先,它跳过将对象转换为字符串.显然你需要调用pckl.value来获取json字符串表示.
Unpickling更令人困惑.反序列化是将字符串(或字节)转换为对象的行为.如果没有对象的字符串/ binry表示,这个"示例"如何演示反序列化?
那么,如何用酸洗库反序列化简单对象呢?
我正在使用Scala Pickling,一个Scala的自动序列化框架.根据作者的幻灯片,T只要有隐含Pickler[T]的范围,任何类型都可以被腌制.在这里,我假设她的意思scala.tools.nsc.io.Pickler.但是,以下内容无法编译:
import scala.pickling._
import scala.pickling.binary._
import scala.tools.nsc.io.Pickler
object Foo {
def bar[T: Pickler](t: T) = t.pickle
}
Run Code Online (Sandbox Code Playgroud)
错误是:
[error] exception during macro expansion:
[error] scala.ScalaReflectionException: type T is not a class
[error] at scala.reflect.api.Symbols$SymbolApi$class.asClass(Symbols.scala:323)
[error] at scala.reflect.internal.Symbols$SymbolContextApiImpl.asClass(Symbols.scala:73)
[error] at scala.pickling.PickleMacros$class.pickleInto(Macros.scala:381)
[error] at scala.pickling.Compat$$anon$17.pickleInto(Compat.scala:33)
[error] at scala.pickling.Compat$.PickleMacros_pickleInto(Compat.scala:34)
Run Code Online (Sandbox Code Playgroud)
我正在使用Scala 2.10.2与scala-pickling 0.8-SNAPSHOT.
这是错误还是用户错误?
编辑1:同样的错误既出现scala.pickling.SPickler和scala.pickling.DPickler.
编辑2:看起来这是一个错误:https://github.com/scala/pickling/issues/31
我试图进入2013年ScalaDays上展示的新Scala Pickling图书馆:Scala Pickling
我真正缺少的是一些简单的例子如何使用库.
我知道我可以像这样腌制一些物体再次破坏它:
import scala.pickling._
val pckl = List(1, 2, 3, 4).pickle
val lst = pckl.unpickle[List[Int]]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,pckl是Pickle类型.究竟什么是这种类型的使用,我怎样才能获得它的数组[字节]?
我正在尝试编写一个自定义SPickler/Unpickler对来解决当前scala-pickling的局限性.我试图挑选的数据类型是一个案例类,其中一些字段已经拥有自己的SPickler和Unpickler实例.我想在我的自定义pickler中使用这些实例,但我不知道如何.
这是我的意思的一个例子:
// Here's a class for which I want a custom SPickler / Unpickler.
// One of its fields can already be pickled, so I'd like to reuse that logic.
case class MyClass[A: SPickler: Unpickler: FastTypeTag](myString: String, a: A)
// Here's my custom pickler.
class MyClassPickler[A: SPickler: Unpickler: FastTypeTag](
implicit val format: PickleFormat) extends SPickler[MyClass[A]] with Unpickler[MyClass[A]] {
override def pickle(
picklee: MyClass[A],
builder: PBuilder) {
builder.beginEntry(picklee)
// Here we save `myString` in some custom way.
builder.putField(
"mySpecialPickler",
b …Run Code Online (Sandbox Code Playgroud) 我尝试了以下单元测试.
第一次测试testUnpickleJsonPickleFormat效果很好.它腌制一个字符串并取出泡菜.
testUnpickleString{1,2}测试以反序列化String.但它们根本不起作用.我不知道哪里有什么想念我.
import org.junit.Test
import scala.pickling._
import scala.pickling.json._
class PicklerTest {
@Test
def testUnpickleJsonPickleFormat {
val src = "elem 1"
val pckl = src.pickle
val res = pckl.unpickle[String]
println(src)
println(pckl.toString +"\n")
println(res)
}
@Test
def testUnpickleString1 {
val json = """JSONPickle({
| "tpe": "java.lang.String",
| "value": "elem 1"
| })""".stripMargin.trim
val pckl = JSONPickle(json.toString)
val res = pckl.unpickle[String]
}
@Test
def testUnpickleString2 {
val src = "elem 1"
val pckl = src.pickle
val pckl2 = JSONPickle(pckl.toString) …Run Code Online (Sandbox Code Playgroud) 对于我的项目,第戎,我想知道是否可以使用Scala pickling进行JSON 序列化和反序列化.具体而言,我想是这样的def toJsonString(json: JSON, prettyPrint: Boolean = false): String和def fromJsonString(json: String): JSON.如何使用酸洗来创建这两种辅助方法?