我可以将 RMPV `Value` 发送回 rmp_serde 进行反序列化吗?

问题描述

我有一个大型的、有点复杂的数据结构,我可以使用 serdermp-serde 对其进行序列化和反序列化,但我发现反序列化非常慢。我认为这是因为我的数据结构包括两个相当大的 HashMap。我不知道 rmp_serde::from_slice 创建 HashMap 的效率有多高——它会使用 .with_capacity 进行初始化还是只是创建一个 HashMap 并一一插入?此外,我发现 AHashMap 在其他地方给了我相当大的性能改进,所以我试图避免使用默认的 HashMap。

我想尝试使用 rmpv::decode::value::read_value 进行反序列化,但我想将大部分反序列化留给 rmp_serde 并且仅在给定一些 Value 的情况下自己实现一些反序列化。有没有办法选择我手动反序列化的部分?

从概念上讲,我想做的是:

let v = rmp::decode::read_value(&mut reader).unwrap();   // get some Value
let arr : &Vec<Value> = v.as_array().unwrap();           // v is known to be an array
let first_value : MyType = deserialize_manually(arr[0]); // I'll convert the Value myself
let second_value : AnotherType = arr[1].into();          // allow rmpv to convert Value for me

我目前使用的是 rmp-serde 0.14 和 rmpv 0.4.7。 The rmp_serde changelogrmp_serde release page 没有提供有关更改内容的详细信息,因此我没有理由相信升级到当前版本(撰写此问题时为 v0.15.4)会提供任何新功能。

我知道 serde 提供了一个 deserialize_with attribute。也许这是合适的路线,所以我的问题是:如何使用 deserialize_with 反序列化特定的 MsgPack 字段?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)