2013-10-17 32 views
3

下面的示例很好,但是我收到一个编译错误,指出不能生成unpickler。下面是一个简单的测试用例来重现此:将类对象参数传递给父类时,无法在类层次结构中生成unpickler

import scala.pickling._ 
import json._ 
object JsonTest extends App { 
    val simplePickle = new Simple(new SimpleProp("TestProp")).pickle 
    val simpleUnpickle = simplePickle.unpickle[Simple] 
} 
abstract class SimpleAbstract(val stringWrapper: SimpleProp) {} 
class Simple(stringWrapper: SimpleProp) extends SimpleAbstract(stringWrapper) {} 
case class SimpleProp(prop: String) {} 

请让我知道如果你需要在此的任何其他信息。

这里是堆栈跟踪我与-Xlog-implicits标志得到:

pickling.this.Unpickler.genUnpickler is not a valid implicit value for scala.pickling.Unpickler[com.ft.flexui.modules.pm.Simple] because: 
exception during macro expansion: 
java.util.NoSuchElementException: None.get 
    at scala.None$.get(Option.scala:313) 
    at scala.None$.get(Option.scala:311) 
    at scala.pickling.Macro.reflectively(Tools.scala:380) 
    at scala.pickling.UnpicklerMacros$$anonfun$impl$2$$anonfun$16.apply(Macros.scala:248) 
    at scala.pickling.UnpicklerMacros$$anonfun$impl$2$$anonfun$16.apply(Macros.scala:245) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251) 
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105) 
    at scala.pickling.UnpicklerMacros$$anonfun$impl$2.unpickleObject$1(Macros.scala:245) 
    at scala.pickling.UnpicklerMacros$$anonfun$impl$2.unpickleLogic$1(Macros.scala:273) 
    at scala.pickling.UnpicklerMacros$$anonfun$impl$2.apply(Macros.scala:291) 
    at scala.pickling.UnpicklerMacros$$anonfun$impl$2.apply(Macros.scala:184) 
    at scala.pickling.Macro.preferringAlternativeImplicits(Tools.scala:357) 
    at scala.pickling.UnpicklerMacros$class.impl(Macros.scala:184) 
    at scala.pickling.Compat$$anon$3.impl(Compat.scala:24) 
    at scala.pickling.Compat$.UnpicklerMacros_impl(Compat.scala:25) 
    at sun.reflect.GeneratedMethodAccessor270.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at scala.tools.nsc.typechecker.Macros$$anonfun$scala$tools$nsc$typechecker$Macros$$macroRuntime$3$$anonfun$apply$8.apply(Macros.scala:544) 
    at scala.tools.nsc.typechecker.Macros$$anonfun$scala$tools$nsc$typechecker$Macros$$macroRuntime$3$$anonfun$apply$8.apply(Macros.scala:544) 
    at scala.tools.nsc.typechecker.Macros$class.scala$tools$nsc$typechecker$Macros$$macroExpandWithRuntime(Macros.scala:830) 
    at scala.tools.nsc.typechecker.Macros$$anonfun$scala$tools$nsc$typechecker$Macros$$macroExpand1$1.apply(Macros.scala:796) 
    at scala.tools.nsc.typechecker.Macros$$anonfun$scala$tools$nsc$typechecker$Macros$$macroExpand1$1.apply(Macros.scala:787) 
    at scala.tools.nsc.Global.withInfoLevel(Global.scala:190) 
    at scala.tools.nsc.typechecker.Macros$class.scala$tools$nsc$typechecker$Macros$$macroExpand1(Macros.scala:787) 
    val simpleUnpickle = simplePickle.unpickle[Simple] 
              ^

回答

1

这是一个错误的肯定。

We lodged a ticket, and fixed it。更新的jar应该在小时内出现在Sonatype上。

测试它在REPL新的罐子,都是现在好了:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.pickling._ 
import json._ 
object JsonTest extends App { 
    val simplePickle = new Simple(new SimpleProp("TestProp")).pickle 
    val simpleUnpickle = simplePickle.unpickle[Simple] 
} 
abstract class SimpleAbstract(val stringWrapper: SimpleProp) {} 
class Simple(stringWrapper: SimpleProp) extends SimpleAbstract(stringWrapper) {} 
case class SimpleProp(prop: String) {} 


// Exiting paste mode, now interpreting. 

import scala.pickling._ 
import json._ 
defined module JsonTest 
defined class SimpleAbstract 
defined class Simple 
defined class SimpleProp 
+0

是啊,我把更新和它现在正常工作对我来说也是如此。再次感谢您的快速转身。这个项目非常酷,正是我们在项目中寻找的东西。希望我们能很快整合它。你是否希望我继续在SO上报告问题,还是有其他地方你会喜欢? –

+0

感谢您的好评,并对延迟表示歉意。提交错误的最佳位置是[scala /酸洗问题跟踪器](https://github.com/scala/pickling/issues?state=open)。感谢您报告这些! –