LoginSignup
0
0

More than 3 years have passed since last update.

scalacacheでCodecを実装してcase classを格納できるようにする

Posted at

scalacache-redisで自前のcase classを保存する際には、そのcase classがSerializableをミクスインしていないとダメっぽい。
Serializableを使わないで格納できるようにするには、以下のCodecトレイトを実装すればよい。

Codecトレイト
trait Codec[A] {
  def encode(value: A): Array[Byte]
  def decode(bytes: Array[Byte]): Codec.DecodingResult[A]
}

以下のような感じで実装する。

User用のCodecを実装した例
import scalacache.Cache
import scalacache.redis.RedisCache
import scalacache.serialization.Codec
import scalacache.serialization.Codec.{ DecodingResult, tryDecode }

case class User(name: String)

private implicit val codec = new Codec[User] {
  def encode(code: User): Array[Byte] = code.value.getBytes("UTF-8")
  def decode(data: Array[Byte]): DecodingResult[User] = tryDecode(User(new String(data, "UTF-8")))
}

private implicit val cache: Cache[User] = RedisCache("localhost", 6379)

scalacache.put("key")(user, ttl = Nothing)

JSONとして格納する

しかし上のやり方だと複数の値を持つタイプのcase classのCodecを実装するのが難しい。
この場合にはcirceを用いてJSONとしてまるごと格納するのがよいとのこと。

import io.circe._
import io.circe.generic.semiauto._

case class User(name: String, age: Int)

implicit val catEncoder: Encoder[User] = deriveEncoder[User]
implicit val catDecoder: Decoder[User] = deriveDecoder[User]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0