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]))
    ...

}