#serialization #partial #serde #filter #serde-derive

no-std serde-partial

让 Serde 部分序列化变得简单

5 个不稳定版本

0.3.1 2022年11月30日
0.3.0 2022年11月30日
0.2.1 2022年11月29日
0.2.0 2022年11月29日
0.1.0 2022年11月29日

#1427编码

Download history 31/week @ 2024-04-20 11/week @ 2024-04-27 19/week @ 2024-05-04 21/week @ 2024-05-11 12/week @ 2024-05-18 11/week @ 2024-05-25 21/week @ 2024-06-01 9/week @ 2024-06-08 9/week @ 2024-06-15 1/week @ 2024-06-22 7/week @ 2024-07-06 37/week @ 2024-07-13 4/week @ 2024-07-20 7/week @ 2024-07-27 2/week @ 2024-08-03

每月52次下载

MIT/Apache

32KB
759

serde-partial

在使用 Serde 时,仍然需要样板代码的事情之一就是部分序列化。

假设我们有一个 API 路由,它返回产品信息。我们只想向管理员返回库存信息,而不是向访客返回。这里有几个选项;有一个包含部分字段的第二个结构体,它也派生了 Serialize,将库存字段设置为 Option,使用 #[serde)] 并在访客中设置为 None,或者使用类似 serde_json::json! 宏进行手动序列化。

这些选项都不太吸引人。需要维护一个结构体并处理每个字段的子集的转换,这需要大量的样板代码。仅为了序列化将始终存在的字段设置为可选的,充其量是一种黑客手段。手动序列化几乎违背了 serde derives 的目的。

serde-partial 致力于使部分序列化(几乎)与完整序列化一样干净和简洁,同时也与 no_std 兼容。使用此包,这个问题可以在一行代码中解决。

use serde::Serialize;
use serde_partial::SerializePartial;

#[derive(Serialize, SerializePartial)]
pub struct Product {
    name: String,
    price: u32,
    stock: u32,
}

fn get_product(id: i32) -> Product {
    todo!()
}

fn product_api(id: i32, is_manager: bool) -> String {
    let product = get_product(id);
    if is_manager {
        serde_json::to_string(&product).unwrap()
    } else {
        serde_json::to_string(&product.without_fields(|p| [p.stock])).unwrap()
    }
}

有关更多详细信息和方法,请参阅 with_fields 文档

依赖关系

~2MB
~44K SLoC