2016-05-06 22 views
0

MappedToslick.typesafeの汎用IDケースクラスである)とジェネリッククラスをシリアライズするには?私はケースクラス</p> <pre><code>case class UserId(value: String) extends MappedTo[String] </code></pre> <p>以下た

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を有することであるIはjson4sそのシリアライザを宣言するそのようなフィールドは、私はそれのそれぞれのシリアライザを宣言したくないです。 MappedToのためにそれを行う方法はありますか?そのサブクラスのすべてに適用できますか?

答えて

0

私が何かを誤解していない限り、あなたは自分のシリアライザをまったく定義する必要はありません。大文字と小文字のクラスには、コンパイラによって定義されたシンプルなシリアライゼーションメソッドと、Json4s will use thatがあります。あなたの他のIDフィールドがケースクラスのメンバーである場合、それらはどちらも必要ではありません。

編集:

私はつかまります。それはちょうどあなたが使用しているケースクラスの大多数である本当の問題、上のパッチ適用されているので、私は、このことをお勧めするには消極的だけど、このような何かがうまくいくかもしれない:

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

だから、ユーザーIDのために、あなたが希望IdSerializer[UserID]に電話してください。より良い解決策は、非常に多くのケースクラスの使用を中止することですが、それはあなたのためのオプションではないかもしれません。肩をすくめる。

+1

はいjson4sはほとんどのケースクラスをシリアライズできます。しかし、 'UserId(value:String)'のシリアル化は '{userId:{value:....}}'です。これは私が期待するものではありません。だから、私は '{userId:...} 'のようにするためにカスタムシリアル化を作成しました。 –

+0

なぜあなたはそれをしたいのか分かります。私は私の答えを更新します。 –

関連する問題