我正在玩板条箱sled,并尝试使用bincode进行简单的序列化和反序列化练习,只是为了了解用法。
虽然我可以插入进行工作,但是尝试获得一系列结果似乎更加困难。在这里,我尝试放入两个记录:值为42的键(值为“ Alice”)和值为69的键(值为“ Bob”),然后检索并打印它们。我很难调和向量的反序列化出来:
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
值时发生的。有趣的是,输出似乎表明sled或bincode正在截断键值。
examples of sled usage似乎并没有解决获取值的问题,但是通过查看一些文档和部分源代码,我感觉到Serde序列化是一种将东西进出雪橇的有效方法。 / p>
答案 0 :(得分:1)
我无法使用上面给出的代码重现此问题,我不确定sled实现是否已更改了与range函数相关的内容的大小,现在是否符合代码的期望,或者这仅仅是一个错误。
更是如此,由于我的粗心大意,我遇到了此错误消息。
fn main() -> Result<(), Error> {
let db = sled::open("foo.sled_db").unwrap();
let codec = bincode::config();
db.insert("uhoh", codec.serialize(&0)?)?;
let ser = &db.get("uhoh")?.unwrap();
let de1: i32 = codec.deserialize(ser)?;
println!("ok... {}", de1);
let de2: usize = codec.deserialize(ser)?;
println!("not ok {}", de2);
}
From<sled::Error>
和From<bincode::Error>
的实现,以简化操作。好... 0
错误:Bincode(Io(自定义{种类:UnexpectedEof,错误:“无法填充整个缓冲区”})
这里要注意的是(正如您所说的)序列化的值较小, 而不是我们尝试反序列化的类型。
println!(
"{} {}",
core::mem::size_of::<usize>(),
core::mem::size_of_val(&0)
);
println!(
"{} {}",
core::mem::size_of::<usize>(),
core::mem::size_of::<i32>()
);
8 4
8 4
要解决此问题,我将其序列化为值&0usize
而不是&0
。
对雪橇键和值使用serde序列化确实看起来不错,但是您确实需要注意推断值的大小。