Rust反序列化:将字节向量转换为uuid的哈希集
我的目标是 序列化(Rust反序列化:将字节向量转换为uuid的哈希集,rust,Rust,我的目标是 序列化(HashSet->Vec) 和反序列化(&[u8]->哈希集) uuid的hashset 我有以下建议: fn serialize(set: HashSet<Uuid>) -> Vec<u8>{ set.into_iter().map(|x| x.as_bytes()).collect() } 问题: 我的序列化是正确的吗 如果我不知道确切的集合大小,那么我如何从和[u8]反序列化回哈希集,如果我知道它以前是使用序列化函数序列化的 我的反序
HashSet
->Vec
)
和反序列化(&[u8]
->哈希集
)
uuid的hashset
我有以下建议:
fn serialize(set: HashSet<Uuid>) -> Vec<u8>{
set.into_iter().map(|x| x.as_bytes()).collect()
}
问题:
我的序列化是正确的吗
如果我不知道确切的集合大小,那么我如何从和[u8]
反序列化回哈希集
,如果我知道它以前是使用序列化
函数序列化的
我的反序列化方法是正确的还是有其他更干净的方法?您的序列化是错误的,因为它试图从
迭代器中收集Vec
。相反,您可以折叠迭代器并在切片上扩展Vec
。对于反序列化,您知道每个Uuid
将占用16个字节,因此您应该使用chunks\u-exact
对其进行迭代并收集到哈希集中:
fn序列化(set:HashSet)->Vec{
设置为折叠(Vec::new(),| mut acc,v |{
acc.extend_from_slice(v.as_bytes());
行政协调会
})
}
fn反序列化(字节:&[u8])->哈希集{
bytes.chunks_exact(16).map(Uuid::from_slice).collect::().unwrap()
}
您的序列化不正确,因为它试图从迭代器中收集Vec
。相反,您可以折叠迭代器并在切片上扩展Vec
。对于反序列化,您知道每个Uuid
将占用16个字节,因此您应该使用chunks\u-exact
对其进行迭代并收集到哈希集中:
fn序列化(set:HashSet)->Vec{
设置为折叠(Vec::new(),| mut acc,v |{
acc.extend_from_slice(v.as_bytes());
行政协调会
})
}
fn反序列化(字节:&[u8])->哈希集{
bytes.chunks_exact(16).map(Uuid::from_slice).collect::().unwrap()
}
更干净的方法可能是使用yeah,但目前我不允许使用任何外部板条箱。serialize方法甚至可以编译吗?它没有,因为它没有理由编译。出于某种原因,我认为是的,可能在编译之前没有保存文件,新手犯了错误。“更干净的方法”可能是使用是的,但目前我不允许使用任何外部板条箱。序列化方法甚至可以编译吗?它没有,因为它没有理由。出于某种原因,我认为是的,可能在编译之前没有保存文件,新手犯了错误。最好使用Vec::with_capacity(set.len()*16)
而不是Vec::new()
,因为guid总是有相同的长度。最好使用Vec::with_capacity(set.len()*16)
而不是Vec::new()
因为guid总是具有相同的长度。
fn clone_into_array<A, T>(slice: &[T]) -> A
where A: Sized + Default + std::convert::AsMut<[T]>,
T: Clone
{
let mut a = Default::default();
<A as std::convert::AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
a
}
fn deserialize(data: &[u8]){
let first_uuid = Uuid::from_bytes(clone_into_array(&data[0..16]))
...
}