我有一个JSON对象,它包含几个元数据键和一个大的数据负载.我的服务关心用于日志(log)记录和路由的元数据,但不关心有效负载,只关心将有效负载传递给另一个服务.我永远不需要出于任何原因查看有效载荷内部.

现在,有效载荷在我的 struct 中表示为aserde_json::Value.通过分析,我看到Value的(反)序列化需要花费大量时间.

Serde中是否有一种机制,可以将有效负载Bundle 在一起,而无需支付将其反序列化为组件值的成本,而只需要在以后重新序列化它们?

extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;

#[derive(Serialize, Deserialize)]
struct DataBlob<'a> {
    id: &'a str,
    priority: u8,
    // payload: OpaqueValue,
}

fn main() {
    let input = r#"{
        "id": "cat",
        "priority": 42,
        "payload": [1, 2, 3, 4]
    }"#;

    let parsed = serde_json::from_str::<DataBlob>(input).expect("Could not deserialize");
    let output = serde_json::to_string(&parsed).expect("Could not serialize");

    assert!(output.contains("payload"));
}

推荐答案

这是在serde_json 1.0.29中添加的类型RawValue.必须使用raw_value功能启用它,然后将其放置在参考后面:

extern crate serde; // 1.0.79
#[macro_use]
extern crate serde_derive; // 1.0.79
extern crate serde_json; // 1.0.30, features = ["raw_value"]

#[derive(Serialize, Deserialize)]
struct DataBlob<'a> {
    id: &'a str,
    priority: u8,
    payload: &'a serde_json::value::RawValue,
}

fn main() {
    let input = r#"{
        "id": "cat",
        "priority": 42,
        "payload": [1, 2, 3, 4]
    }"#;

    let parsed = serde_json::from_str::<DataBlob>(input).expect("Could not deserialize");
    let output = serde_json::to_string(&parsed).expect("Could not serialize");

    assert!(output.contains("payload"));
}

Rust相关问答推荐

PyReadonlyArray2到Vec T<>

Rust中的相互递归特性与默认实现

如何找到一个数字在二维数组中的位置(S)?

如何在Rust中实现Functor trait?

我怎样才能从一个Rust 的日期中go 掉3年?

具有对同一类型的另一个实例的可变引用的

在Rust中,如果Result是Err,运行副作用(如日志(log)记录)的惯用方法是什么

在Rust中声明和定义一个 struct 体有什么区别

通过异常从同步代码中产生yield 是如何工作的?

如何在 Rust 中打印 let-else 语句中的错误?

在 Rust 中查找向量中 dyn struct 的索引

注释闭包参数强调使用高阶排定特征界限

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

push 方法是否取得所有权?

为什么 i32 Box 类型可以在 Rust 中向下转换?

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?

如何将 while 循环内的用户输入添加到 Rust 中的向量?

当引用不再被borrow 时,Rust 不会得到它

为什么当borrow 变量发生变化时,borrow 变量不会改变?