0

だから私は BooPickle を使用して、Scala クラスをシリアル化してから RocksDB に書き込みます。クラスをシリアライズするには、

case class Key(a: Long, b: Int) {

def toStringEncoding: String = s"${a}-${b}"
}

私はこの暗黙のクラスを持っています

  implicit class KeySerializer(key: Key) {
    def serialize: Array[Byte] = 
      Pickle.intoBytes(key.toStringEncoding).array
  }

このメソッドtoStringEncodingが必要なのは、BooPickle がキーの順序に関する RocksDb の要件にうまく対応する方法でケース クラスをシリアル化していなかったからです。次に、一連のキーと値のペアをいくつかの SST ファイルに書き込み、それらを RocksDb に取り込みます。しかし、データベースからキーを検索しようとすると、それらが見つかりません。

データベース内のすべてのキーを反復すると、キーが正常に書き込まれていることがわかりますが、余分なバイトがデータベース内のバイト表現に書き込まれます。たとえば、key.serializeこのようなものを出力する場合

Array[Byte] = Array( 25, 49, 54, 48, 53, 55, 52, 52, 48, 48, 48, 45, 48, 45, 49, 54, 48, 53, 55, 52, 52, 48, 51, 48, 45, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...)

私がデータベースで見つけるのは、このようなものです

Array[Byte] = Array( 25, 49, 54, 48, 53, 55, 52, 52, 48, 48, 48, 45, 48, 45, 49, 54, 48, 53, 55, 52, 52, 48, 51, 48, 45, 48, 51, 101, 52, 97, 49, 100, 102, 48, 50, 53, 5, 8, ...)

余分な非ゼロ バイトは、バイト配列の最後のゼロ バイトを置き換えます。さらに、バイト配列のサイズが異なります。メソッドを呼び出すとserialize、バイト配列のサイズは 512 ですが、データベースからキーを取得すると、サイズは 4112 になります。

4

2 に答える 2