Используя Sled, как мне сериализовать и десериализовать? - PullRequest
0 голосов
/ 12 октября 2019

Я играю с ящиком салазками и пытаюсь выполнить простое упражнение сериализации и десериализации, используя bincode , просто чтобы понять, как его использовать.

Пока яможет заставить вставку работать, попытка получить диапазон результатов кажется более сложной. Здесь я пытаюсь вставить две записи: ключ 42 со значением «Алиса» и ключ 69 со значением «Боб, а затем получить и распечатать их. Мне трудно согласовать десериализацию векторовчто получается:

use crate::db::Database;
use sled::Db;
use bincode;


pub struct SledDatabase {
    db: Db,
}

impl Database for SledDatabase {
    fn create(&self) {
        // Not handling errors; just an example.
        let key: i64 = 42;
        println!("ser {:?}", bincode::serialize(&key).unwrap());
        self.db.insert(bincode::serialize(&key).unwrap(), bincode::serialize("Alice").unwrap());
        let key2: i64 = 69;
        self.db.insert(bincode::serialize(&key2).unwrap(), bincode::serialize("Bob").unwrap());
    }

    fn query(&self, value : i64) {
        let range = value.to_ne_bytes();
        let mut iter = self.db.range(range..);
        while let Some(item) = iter.next() {
            let (k, v) = item.unwrap();
            println!("res {:?}", k);
            let key: i64 = bincode::deserialize(&k).unwrap();
            let value: String = bincode::deserialize(&v).unwrap();
            println!("age = {}", key);
            println!("name = {}", value);
        }
    }
}

impl SledDatabase {
    pub fn connect() -> SledDatabase {
        // use sled::{ConfigBuilder, Error};
        // let config = ConfigBuilder::new().temporary(true).build();
        SledDatabase { db: Db::open("sled.db").unwrap() }
    }
}

Попытка взаимодействовать с этим с помощью прослушивателя записи консоли, который я собрал, я получаю следующий вывод:

ser [42, 0, 0, 0, 0, 0, 0, 0]
>> 1
res [42]
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Io(Custom { kind: UnexpectedEof, error: "failed to fill whole buffer" })', src/libcore/result.rs:1084:5

Это происходит при любой попыткедесериализовать (либо значение String, либо значение i64. Интересно, что выходные данные, по-видимому, указывают на то, что сани или бинкод усекают значение ключа.

примеры использования салазок donПохоже, что это не касается извлечения значений, но, просматривая некоторую документацию и части исходного кода, я понимаю, что сериализация serde - это верный способ получить информацию из саней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...