#serialization #serde #cbor #no-std

no-std serde_ipld_dagcbor

Serde 对 DAG-CBOR 的支持

13 个不稳定版本 (5 个破坏性更新)

0.6.1 2024年4月24日
0.6.0 2024年3月26日
0.5.0 2024年3月18日
0.4.2 2023年9月12日
0.1.2 2022年3月21日

#104 in 编码

Download history 2379/week @ 2024-05-03 2601/week @ 2024-05-10 2526/week @ 2024-05-17 2018/week @ 2024-05-24 2088/week @ 2024-05-31 2330/week @ 2024-06-07 2433/week @ 2024-06-14 2769/week @ 2024-06-21 1928/week @ 2024-06-28 2495/week @ 2024-07-05 3780/week @ 2024-07-12 2374/week @ 2024-07-19 2018/week @ 2024-07-26 3194/week @ 2024-08-02 2330/week @ 2024-08-09 2721/week @ 2024-08-16

10,758 每月下载量
用于 145 个 crate (20 直接)

MIT/Apache

63KB
1.5K SLoC

Serde IPLD DAG-CBOR

Crates.io Documentation

这是一个用于 SerdeDAG-CBOR 实现。它可以与 ipld-core 一起使用。

CBOR 编码/解码的底层库是 cbor4ii,Serde 实现也大量基于他们的代码。

这个 crate 是从 serde_cbor 分支出来的,感谢所有参与其中的人。

用法

存储和加载 Rust 类型非常简单,只需对程序代码进行最小修改。

use serde_derive::{Deserialize, Serialize};
use std::error::Error;
use std::fs::File;
use std::io::BufReader;

// Types annotated with `Serialize` can be stored as DAG-CBOR.
// To be able to load them again add `Deserialize`.
#[derive(Debug, Serialize, Deserialize)]
struct Mascot {
    name: String,
    species: String,
    year_of_birth: u32,
}

fn main() -> Result<(), Box<dyn Error>> {
    let ferris = Mascot {
        name: "Ferris".to_owned(),
        species: "crab".to_owned(),
        year_of_birth: 2015,
    };

    let ferris_file = File::create("examples/ferris.cbor")?;
    // Write Ferris to the given file.
    // Instead of a file you can use any type that implements `io::Write`
    // like a HTTP body, database connection etc.
    serde_ipld_dagcbor::to_writer(ferris_file, &ferris)?;

    let tux_file = File::open("examples/tux.cbor")?;
    let tux_reader = BufReader::new(tux_file);
    // Load Tux from a file.
    // Serde IPLD DAG-CBOR performs roundtrip serialization meaning that
    // the data will not change in any way.
    let tux: Mascot = serde_ipld_dagcbor::from_reader(tux_reader)?;

    println!("{:?}", tux);
    // prints: Mascot { name: "Tux", species: "penguin", year_of_birth: 1996 }

    Ok(())
}

功能

codec

默认启用 codec 功能,它提供了 Codec trait,它使得编码和解码独立于 IPLD Codec。通过禁用此功能,可以显著降低最低支持的 Rust 版本 (MSRV) 到 1.64。

no-cid-as-bytes

有时我们希望 CID 不会意外地反序列化为字节。这可能会发生,因为中间的 serde 数据模型没有保留足够的信息,无法在做出冲突选择时区分字节容器和 CID 容器,例如某些枚举情况。可以通过启用 no-cid-as-bytes 功能,在这些情况下在运行时产生错误。

该功能的缺点在于它会破坏Serde为内部标记枚举(代码:#[serde(tag = "sometag")])和无标记枚举(代码:#serde(untagged))提供的派生属性。如果启用此功能,并且仍然需要类似的功能,您可以手动实现反序列化器。有关如何实现的示例,请参阅枚举示例

许可证

根据以下任一许可证授权:

任选其一。

依赖项

~2.5MB
~56K SLoC