如何借用字段进行序列化但在反序列化时创建它?

2024-01-09

我有一个这样的结构:

#[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(使用前将#替换为@)

如何借用字段进行序列化但在反序列化时创建它? 的相关文章

随机推荐

  • Xcode账户认证失败

    当我尝试登录 Apple ID 帐户时出现问题 重新登录也没用 Xcode 14 0 我也遇到了同样的问题 我就是这样解决的 您必须访问该部分Xcode 帐户是 要访问它 您可以通过View accounts警告中出现的按钮或通过Xcode
  • bash 脚本可以同时运行命令然后等待它们完成吗?

    我想编写一个 bash 脚本 在其中同时运行两个命令 然后在它们都完成后继续 这是不起作用的 但我将其放在这里来说明我正在尝试做的事情 bin bash job1 job2 dostuffwithresults 该脚本将同时运行 job1
  • Selenium WebDriver 和 InternetExplorer

    我最近更新到 Selenium 2 24 1 以使 Firefox 13 正常工作 通过此更新 您现在可以运行类似于 chromedriver exe 的可执行文件 以便将事件分派到 IE 然而我没有运气让测试与 IE 一起运行 为了让它在
  • 如何在FOR循环中批量获取当前路径%CD%的信息?

    我设置了一个环境变量 其中包含多个逗号分隔的目录路径 并使用FOR循环将当前目录设置为变量中的下一个目录路径 我尝试获取当前路径 但结果看起来很奇怪 我尝试使用以下代码 set a C test A C test B C test C fo
  • lambda 和 LINQ 之间的区别? [复制]

    这个问题在这里已经有答案了 有人可以解释一下 lambda 和 linq 之间的区别吗 请不要向我指出其他 stackexchange 答案或琐碎的解释 我已经检查了其中的大部分 它们非常令人困惑 这些天我使用了一些 LINQ 我相信 其表
  • 更改来自 Lambda (Node.js) 的 Cloudwatch 日志的日志格式

    If I do console log message 在我的代码中 它在 Cloudwatch 中显示为 2017 03 16T18 58 21 823Z 863c835c 0a7a 11e7 9140 e5018d6e5029 mess
  • Hibernate Session 不使用 JpaTransactionManager 事务

    我正在开发一个使用 Spring 框架 4 3 3 RELEASE 和 Hibernate 5 2 3 Final 的项目 并且我开始转向使用 Spring Data JPA 我刚刚迁移了LocalSessionFactoryBean wi
  • DialogFragment 中未调用 OnCancelListener

    我有一个简单的AlertDialog显示一些项目的列表 单击其中一个项目后 所单击的项目将传回封闭的项目Activity 我还想在用户取消对话框时执行一些默认处理 使用返回键 更具体地说 在这种情况下 我想将空字符串传递给活动 但是 如果我
  • 在另一个用户上下文中执行代码

    我有一个应用程序 其清单需要以管理员身份运行 但该应用程序的一部分是使用 WNetAddConnection2 映射驱动器 我认为由于凭据等原因 它需要在正常用户上下文中运行 有没有办法执行此操作普通用户上下文中的一些代码 无需创建单独的进
  • 在 CentOS 上安装 psycopg2 时遇到问题

    我正在尝试在 CentOS 上安装 psycopg2 我遵循了这方面的所有内容tutorial http thebuild com blog 2009 10 17 wordpress to djangopostgresql part 3 i
  • 如何使用多个索引从 NumPy 数组中获取值

    我有一个 NumPy 数组 如下所示 arr np array 100 10 200 42 4 14 89 00 34 55 1 12 如何通过索引从该数组中获取多个值 例如 如何获取索引位置1 4 5处的值 我正在尝试这样的事情 这是不正
  • 使用资源设置窗口背景颜色

    我需要使用资源来设置 WPF 应用程序中主窗口的颜色 由于资源声明位于窗口声明之后 我正在导入资源字典 因此我无法使用Background财产在Window目的 所以 我想我应该这样设置背景
  • 如何使用 LAG() 忽略 BigQuery 中的空值?

    使用时LAG 在 BigQuery 标准 SQL 中 https cloud google com bigquery docs reference standard sql functions and operators 如何跳过NULL值
  • 位置固定元素

    我真的被 HTML5 的一个小问题困扰了 我只是想定位一个固定元素 我有一个 jpg 作为标题 在下面我有一个名为 menu 的 div 其中包含导航 我一直在尝试通过 jss 和许多 css 规则使这个 div 菜单固定 因为当我向下滚动
  • 在 R 中重写这个列表理解

    gt gt gt x y for x y in zip range 3 1 11 111 0 11 222 不是这样的 gt data frame 0 2 c 1 11 111 X0 2 c 1 11 111 1 0 1 2 1 11 3
  • MassTransit 与 RabbitMQ:消息何时移至错误队列

    我正在使用 RabbitMQ 版本 3 0 2 我在错误队列中看到接近 1000 条消息 我想知道 消息在什么时候被移至错误队列 有没有办法知道为什么某个消息被移动到错误队列 有什么方法可以将消息从错误队列移动到正常队列吗 谢谢 a 无法反
  • 为什么我应该在这个程序中使用 fflush(stdin) ?

    我知道它是用来清理键盘缓冲区的 但是我不明白何时 为什么需要使用它或者我是否真的需要 例如 在我为班级编写的这段代码中 只有当我输入fflush stdin 之后立即进入主函数while 我只知道这一点 因为教授在我向他展示错误后告诉我这样
  • Eclipse 隐形编辑器

    我有日食朱诺 我不知道如何 但我在 Eclipse 中的编辑器现在是 隐形的 我所说的不可见是指编辑器窗格不在可见窗口中 我不是 Eclipse 的新手 我知道您可以最小化编辑器或最大化不同的面板 但事实并非如此 编辑器所在的空白区域甚至没
  • @import 与 #import - iOS 7

    我正在尝试一些新的 iOS 7 功能 并使用 WWDC 视频 在 iOS 上实现引人入胜的 UI 中讨论的一些图像效果 为了在会话的源代码中产生模糊效果 UIImage通过导入 UIKit 的类别进行扩展 如下所示 import UIKit
  • 如何借用字段进行序列化但在反序列化时创建它?

    我有一个这样的结构 derive Serialize Deserialize struct Thing pub small header Header pub big body Body 我想把这个连载Thing通过网络发送 我已经有一个B