2016-05-06 50 views
0

我有以下情形类如何序列化泛型类?

case class UserId(value: String) extends MappedTo[String] 

MappedTo是一个通用的ID案例类的slick.typesafe) 和我宣布其在json4s串行

case object IdSerializer extends CustomSerializer[UserId](format => ({ 
    case JString(s) => UserId(s) 
    case JNull | JNothing => null 
    }, { 
    case i: UserId => JString(i.value) 
    case JNull | JNothing => null 
    })) 

的问题是,我有超过20个ID这样的字段,我不想为每个字段声明序列化程序。有没有办法做到这一点MappedTo,所以它可以应用到它的所有子类?

回答

0

除非我误解了某些东西,否则根本不需要定义自己的序列化程序; case类具有由编译器为其定义的简单序列化方法,并且Json4s will use that。如果您的其他ID字段是案例类的成员,他们也不会需要一个。

编辑:

我陷害了。我不愿意表明这一点,因为它只是修补了真正的问题,这是大量使用的是case类的,但这样的事情可能工作:

class IdSerializer[T] extends CustomSerializer[T <: MappedTo](format => ({ 
    case JString(s) => new T(s) 
    case JNull | JNothing => null 
    }, { 
    case i: T => JString(i.value) 
    case JNull | JNothing => null 
    })) 

所以对于用户名,你会请致电IdSerializer[UserID]。更好的解决方案是停止使用这么多的案例类,但也许这不适合你。耸耸肩。

+1

是的,json4s可以序列化大部分case类。然而,用'UserId(value:String)'它的序列化是'{userId:{value:....}}'这不是我所期望的。所以我创建了一个自定义序列化,使其像'{userId:...}' –

+0

哦,我明白了为什么你可能想这样做。我会更新我的答案。 –

相关问题