#序列化 #反序列化 #解码

simple_serde

围绕多个serde库的包装器,简化了多种类型的编码和解码

13个版本 (3个稳定版)

2.0.0 2024年5月7日
1.1.3 2024年5月7日
1.0.0-rc12022年4月15日
0.3.8 2022年1月27日
0.1.0 2022年1月21日

#342编码

每月33次下载
2 crates 中使用

MIT 协议

75KB
1.5K SLoC

Simple Serde

Simple serde正如其名,是对多个序列化和反序列化存储库的简化实现。

简而言之,目标是拥有一个用于序列化和反序列化的单一工具,具有通用接口。

用法

Simple Serde使用 .encode.decode 进行编码和解码。解码可以应用于任何 Vec<u8>&[u8],这使得实现最为简洁。对于任何需要序列化/编码的内容也是如此。任何实现了 #[derive(Serialize)] 的类型都可以轻松使用 .encode 进行编码

编码/解码

.encode.decode 都接受一个 ContentType,它定义了你要编码/解码的内容。例如,可以是 [some Vec<u8>].decode("bson")my_struct.encode("bson")。这是可能的,因为 ContentType&strString 实现了 TryFrom 特性。如果实现无法从您尝试编码/解码的类型中解码,编码器/解码器将返回包含 Error::UnknownContentTypeMatchFromStrErr 结果

编码器输出的内容类型将为 Vec<u8> 类型,进一步地,这个 Vec<u8> 被一个名为 Encoded 的结构体包装,这使得实现进一步简化,例如,TryToString 将自动尝试将 Encoded 转换为 String,此外,Encoded 实现了 DerefDerefMut 特性,使得获取封装数据更加容易。

支持的格式

  • Bson
  • Cbor
  • FlexBuffers
  • Json
  • Json5
  • Lexpr
  • MessagePack
  • Pickle
  • Postcard
  • Ron
  • Toml
  • Url
  • Yaml
  • Xml (等待 serde-xml-rs v. >0.51)

所有 ContentType 的字符串定义均不区分大小写,并且有备选的

  • application/[格式]
  • application/x-[格式]

序列化/编码示例

use std::ops::Deref;
use serde::Serialize;
#[macro_use]
use serde_derive;
use simple_serde::{Encoded, SimpleEncoder, TryToString};

#[derive(Serialize)]
struct Foo {
    bar: String,
}

let my_foo = Foo {
  bar: "foobar".to_string(),
};

let encoded: Encoded = my_foo
  .encode("yaml")
  .expect("Should have been encoded in yaml");

assert_eq!(
    &vec![45, 45, 45, 10, 98, 97, 114, 58, 32, 102, 111, 111, 98, 97, 114, 10],
    encoded.deref()
);
assert_eq!(r#"---
bar: foobar
"#, encoded.try_to_string().unwrap())

反序列化/解码示例

use std::ops::Deref;
use serde::Deserialize;
#[macro_use]
use serde_derive;
use simple_serde::{Decoded, SimpleDecoder};

#[derive(Deserialize, Debug, PartialEq)]
struct Foo {
    bar: String,
}

let my_foo = Foo {
  bar: "foobar".to_string(),
};

let v_u8_data = &vec![45, 45, 45, 10, 98, 97, 114, 58, 32, 102, 111, 111, 98, 97, 114, 10];
let string_data = r#"---
bar: foobar
"#;

let decoded_from_v_u8: Decoded<Foo> = v_u8_data.decode("yaml").expect("Should have decoded the Vec<u8>");
let decoded_from_string: Decoded<Foo> = string_data.decode("yaml").expect("Should have decoded the String");

assert_eq!(
    Foo{bar: "foobar".to_string()},
    decoded_from_v_u8.into()
);
assert_eq!(
    Foo{bar: "foobar".to_string()},
    decoded_from_string.into()
);

贡献

欢迎任何合并请求!

许可

MIT

依赖

~8–19MB
~288K SLoC