我正在尝试迁移到upickle 0.7.1的最新版本。以前我曾经绕过隐式Reader和Writer的地方,我相信我现在必须使用一个ReadWriter并在随同对象中为要序列化的所有case类显式定义它们。但是我无法弄清楚这对于参数化类型如何工作。例如,说升级之前(从0.4.4开始)我有以下内容:
# remove "query = query.select()", just "query = query.where()"
if template.quantity_w:
query = query.where(database.Image.quantity_w == True)
elif template.quantity_m:
query = query.where(database.Image.quantity_m == True)
elif template.quantity_m_w:
query = query.where(database.Image.quantity_m_w == True)
上面的代码对我来说很好。要迁移此代码,我尝试了以下操作:
trait OldTrait[T] {
implicit val evr: Reader[T]
implicit val evw: Writer[T]
def save(t: T): String = write(t)
def restore(str: String): T = read[T](str)
}
class MyOldClass[T](implicit val evr: Reader[T], val evw: Writer[T]) extends OldTrait[T] {
}
case class Request[T](msg: T)
val c1 = new MyOldClass[Request[Int]]
但这不会为我编译。我收到以下错误:
不知道如何派生类型... Request []隐式val rw: ReadWriter [Request []] = macroRW
...找不到参数evrw的隐式值: upickle.default.ReadWriter [Request [Int]]
...构造函数MyNewClass的参数不足:(隐式evrw: upickle.default.ReadWriter [Request [Int]])MyNewClass [Request [Int]]。 未指定的值参数evrw。 val c2 =新 MyNewClass [Request [Int]]
迁移旧代码的正确方法是什么?
答案 0 :(得分:1)
未经测试,但我希望您需要
implicit def rw[T: ReadWriter]: ReadWriter[Request[T]] = macroRW
例如因为有ReadWriter[Int]
,所以也有ReadWriter[Request[Int]]
。
(如果这不起作用,我会感到非常惊讶,但是在这种情况下,您当然可以手动代替macroRW
。)