2016-05-06 19 views
0

ich folgenden Fall KlasseWie serialisiert generische Klasse?

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

haben (MappedTo ist ein generischer ID Fall Klasse von slick.typesafe) und ich erkläre seine Serializer in 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 
    })) 

Das Problem ist, dass ich mehr als 20 id haben Felder wie das, und ich möchte Serializer für jedes davon nicht deklarieren. Gibt es eine Möglichkeit, es für MappedTo zu tun, so dass es auf alle seine Unterklasse angewendet werden kann?

Antwort

0

Wenn ich etwas nicht falsch verstehe, müssen Sie keinen eigenen Serializer definieren. Fallklassen haben eine einfache Serialisierungsmethode, die vom Compiler für sie definiert wurde, und Json4s will use that. Wenn Ihre anderen ID-Felder Mitglieder einer Fallklasse sind, benötigen sie auch keine.

Edit:

I gotcha. Ich bin nur ungern dies vorzuschlagen, da es nur über das eigentliche Problem Patching, der die große Anzahl von Fallklassen ist Sie verwenden, aber so etwas wie dies funktionieren könnte:

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 
    })) 

Also für Benutzer-ID, würden Sie Anruf IdSerializer[UserID]. Eine bessere Lösung ist es, so viele Fallklassen nicht mehr zu verwenden, aber vielleicht ist das für Sie keine Option. Shrugs.

+1

Ja json4s kann die meisten Fallklassen serialisieren. Mit 'UserId (value: String)' ist die Serialisierung jedoch '{userId: {value: ....}}' was ich nicht erwarte. Also habe ich eine benutzerdefinierte Serialisierung erstellt, um es wie '{userId: ...}' –

+0

Oh, ich kann sehen, warum Sie das tun möchten. Ich werde meine Antwort aktualisieren. –