我有一个这样的结构:
#[derive(Serialize, Deserialize)]
struct Thing {
pub small_header: Header,
pub big_body: Body,
}
我想把这个连载Thing
通过网络发送。我已经有一个Body
可用但是我无法移动它(想象一下我正在用它做一些事情,然后我时不时地收到一条命令,暂时停止我正在做的事情并发送我现在拥有的任何数据)并且我无法复制它(它太大了,可能有数百兆字节)。
所以我希望 Serde 借用我用来序列化它的那个,因为它不需要为此移动到一个结构中。如果我重写Thing
仅供参考,我显然无法得出Deserialize
!
我一直在使用的解决方法只是使用Arc<Body>
在我的代码中,这样我就可以按照正常逻辑处理主体,当我需要序列化它时,我可以做一个廉价的克隆并将Arc<Body>
进入结构体进行序列化。在反序列化过程中,Serde 将创建一个新的Arc
重新计数为 1。
这仍然涉及到散射Arc
遍布我的代码,这不太好,更不用说不必要的(尽管很小)运行时成本了。此用例的正确解决方案是什么?
有趣的是,如果我不必发送标头,那么这将不是问题,因为我可以通过引用进行序列化并通过值进行反序列化,但是标头的存在使得这变得不可能。我觉得我错过了一些关于 Serde 如何在这里借用数据的事情......
你可以使用Cow https://doc.rust-lang.org/std/borrow/enum.Cow.html,这将是Cow::Borrowed
序列化时并将反序列化为Cow::Owned
反序列化时。
use std::borrow::Cow;
#[derive(Serialize, Deserialize)]
struct Thing<'a> {
small_header: Header,
big_body: Cow<'a, Body>,
}
或者,您可以将序列化和反序列化为两个独立的数据结构。
#[derive(Serialize)]
struct SerializeThing<'a> {
small_header: Header,
big_body: &'a Body,
}
#[derive(Deserialize)]
struct DeserializeThing {
small_header: Header,
big_body: Body,
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)