Rust 使用Sled,如何序列化和反序列化?

Rust 使用Sled,如何序列化和反序列化?,rust,bincode,Rust,Bincode,我正在摆弄这个板条箱,并尝试使用一个简单的序列化和反序列化练习,只是为了掌握使用情况 虽然我可以让插入工作,但尝试获得一系列结果似乎更困难。在这里,我尝试放入两个记录:一个键为42,值为“Alice”,一个键为69,值为“Bob”,然后检索并打印它们。我很难协调出来的向量的反序列化: 使用板条箱::db::数据库; 使用sled::Db; 使用二进制编码; 发布结构数据库{ db:db, } SLEDE数据库的impl数据库{ fn创建(&self){ //不处理错误;只是一个例子。 let键:

我正在摆弄这个板条箱,并尝试使用一个简单的序列化和反序列化练习,只是为了掌握使用情况

虽然我可以让插入工作,但尝试获得一系列结果似乎更困难。在这里,我尝试放入两个记录:一个键为42,值为“Alice”,一个键为69,值为“Bob”,然后检索并打印它们。我很难协调出来的向量的反序列化:

使用板条箱::db::数据库;
使用sled::Db;
使用二进制编码;
发布结构数据库{
db:db,
}
SLEDE数据库的impl数据库{
fn创建(&self){
//不处理错误;只是一个例子。
let键:i64=42;
println!(“ser{:?}”,bincode::serialize(&key).unwrap());
self.db.insert(bincode::serialize(&key).unwrap(),bincode::serialize(“Alice”).unwrap());
设key2:i64=69;
self.db.insert(bincode::serialize(&key2).unwrap(),bincode::serialize(“Bob”).unwrap());
}
fn查询(&self,值:i64){
让range=value.to_ne_字节();
设mut iter=self.db.range(range.);
而让一些(项目)=iter.next(){
设(k,v)=项。展开();
println!(“res{:?}”,k);
let key:i64=bincode::反序列化(&k).unwrap();
let值:String=bincode::反序列化(&v).unwrap();
println!(“年龄={}”,键);
println!(“name={}”,value);
}
}
}
impl SLED数据库{
pub fn connect()->SledDatabase{
//使用底座::{ConfigBuilder,错误};
//让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
这发生在尝试反序列化时(字符串
或值
i64
)。有趣的是,输出似乎表明sled或bincode正在截断键值


这个问题似乎没有解决检索值的问题,但通过查看一些文档和部分源代码,我感觉到serde序列化是一种有效的方法,可以从sled中获取信息。

我无法用上面给出的代码重现这个问题,我不确定sled实现是否改变了r的大小对range函数非常满意,现在符合代码的预期,或者这只是一个bug

尽管如此,由于我的一些粗心,我还是遇到了这个错误消息

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);
}
fn main()->结果{
让db=sled::open(“foo.sled_db”).unwrap();
让codec=bincode::config();
db.insert(“uhoh”,编解码器序列化(&0)?)?;
让ser=&db.get(“uhoh”)?.unwrap();
设de1:i32=编解码器。反序列化(ser)?;
println!(“ok…{}”,de1);
让de2:usize=codec.deserialize(ser)?;
println!(“不正常{},de2);
}
  • 为了简化操作,我省略了
中的
中的
的实现

好的……0

错误:Bincode(Io(自定义{kind:UnexpectedEof,错误:“未能填充整个缓冲区”})

这里需要注意的是(正如您所说)序列化的值更小, 而不是我们试图反序列化到的类型

println!(
       "{} {}",
       core::mem::size_of::<usize>(),
       core::mem::size_of_val(&0)
);

println!(
        "{} {}",
        core::mem::size_of::<usize>(),
        core::mem::size_of::<i32>()
);
println(
"{} {}",
core::mem::size_of:(),
核心::内存::大小值(&0)
);
普林顿(
"{} {}",
core::mem::size_of:(),
core::mem::size_of::()
);
8 4

8 4

为了解决这个问题,我用值
&0usize
而不是
&0
序列化了它。 对sled键和值使用serde序列化看起来确实不错,但您确实需要注意值的推断大小