问题描述
我有一个大型的、有点复杂的数据结构,我可以使用 serde
和 rmp-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 changelog 和 rmp_serde release page 没有提供有关更改内容的详细信息,因此我没有理由相信升级到当前版本(撰写此问题时为 v0.15.4)会提供任何新功能。
我知道 serde 提供了一个 deserialize_with
attribute。也许这是合适的路线,所以我的问题是:如何使用 deserialize_with
反序列化特定的 MsgPack 字段?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)