标签: scala-pickling

Scala酸洗案例类版本控制

我希望能够使用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)


我做错什么了吗 ?

是否存在使我的场景工作的现有方法?

问候

scala scala-pickling

11
推荐指数
1
解决办法
522
查看次数

斯卡拉酸洗:怎么样?

我正在尝试使用"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表示,这个"示例"如何演示反序列化?

那么,如何用酸洗库反序列化简单对象呢?

serialization scala scala-pickling

9
推荐指数
1
解决办法
6045
查看次数

Scala酸洗和类型参数

我正在使用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.SPicklerscala.pickling.DPickler.

编辑2:看起来这是一个错误:https://github.com/scala/pickling/issues/31

scala scala-pickling

7
推荐指数
1
解决办法
2633
查看次数

Scala Pickling用法MyObject - > Array [Byte] - > MyObject

我试图进入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类型.究竟什么是这种类型的使用,我怎样才能获得它的数组[字节]?

scala scala-pickling

5
推荐指数
1
解决办法
1720
查看次数

Scala Pickling:为嵌套结构编写自定义pickler/unpickler

我正在尝试编写一个自定义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)

scala scala-pickling

5
推荐指数
1
解决办法
1831
查看次数

斯卡拉从字符串unpickling

我尝试了以下单元测试.

第一次测试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 scala-pickling

4
推荐指数
1
解决办法
1084
查看次数

Scala Pickling用于Json序列化和反序列化?

对于我的项目,第戎,我想知道是否可以使用Scala pickling进行JSON 序列化序列化.具体而言,我想是这样的def toJsonString(json: JSON, prettyPrint: Boolean = false): Stringdef fromJsonString(json: String): JSON.如何使用酸洗来创建这两种辅助方法?

json scala jsonserializer scala-pickling scala-2.11

3
推荐指数
1
解决办法
1521
查看次数