だから私は 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 になります。