18

以下の例のように、ケース クラスのネストされたオブジェクト グラフがあり、それらのコレクションを redis リストに保存したい場合、どのライブラリまたはツールを調べれば、全体的なラウンド トリップが最速になりますか?レディス?

これには以下が含まれます。

  • アイテムをシリアル化する時間
  • シリアル化されたデータを転送するためのネットワーク コスト
  • 保存されたシリアル化されたデータを取得するためのネットワーク コスト
  • ケースクラスにデシリアライズする時間

    case class Person(name: String, age: Int, children: List[Person]) {}
    
4

4 に答える 4

9

アップデート:

JDK のシリアル化メソッドを使用する場合は注意が必要です。パフォーマンスは良くなく、クラスを少し変更すると、データを逆シリアル化できなくなります。


scala/pickling を使用しましたが、シリアル化/逆シリアル化中にグローバル ロックが発生します。

したがって、それを使用する代わりに、次のような独自のシリアライゼーション/デシリアライゼーション コードを記述します。

import java.io._

object Serializer {

  def serialize[T <: Serializable](obj: T): Array[Byte] = {
    val byteOut = new ByteArrayOutputStream()
    val objOut = new ObjectOutputStream(byteOut)
    objOut.writeObject(obj)
    objOut.close()
    byteOut.close()
    byteOut.toByteArray
  }

  def deserialize[T <: Serializable](bytes: Array[Byte]): T = {
    val byteIn = new ByteArrayInputStream(bytes)
    val objIn = new ObjectInputStream(byteIn)
    val obj = objIn.readObject().asInstanceOf[T]
    byteIn.close()
    objIn.close()
    obj
  }
}

これを使用する例を次に示します。

case class Example(a: String, b: String)

val obj = Example("a", "b")
val bytes = Serializer.serialize(obj)
val obj2 = Serializer.deserialize[Example](bytes)
于 2015-12-28T10:55:09.753 に答える
0

upickleベンチマークによると、「uPickle は、読み取り/書き込みでは Circe よりも 30 ~ 50% 高速で実行され、ケース クラスのシリアル化では play-json よりも ~200% 高速に実行されます」。

使い方は簡単です。ケース クラスを JSON 文字列にシリアル化する方法は次のとおりです。

case class City(name: String, funActivity: String, latitude: Double)
val bengaluru = City("Bengaluru", "South Indian food", 12.97)
implicit val cityRW = upickle.default.macroRW[City]
upickle.default.write(bengaluru) // "{\"name\":\"Bengaluru\",\"funActivity\":\"South Indian food\",\"latitude\":12.97}"

バイナリ形式またはその他の形式にシリアル化することもできます。

于 2020-12-23T03:30:27.843 に答える