12 个版本 (6 个破坏性更新)
0.7.0 | 2023年12月29日 |
---|---|
0.6.2 | 2023年9月23日 |
0.6.0 | 2023年6月27日 |
0.5.0 | 2022年12月26日 |
0.3.0 | 2022年2月27日 |
#244 在 编码
每月下载量 327
在 25 个 crate (3 个直接使用) 中使用
155KB
3K SLoC
🗂️ type_reg
任何类型的可序列化映射。
此库提供了一种可以存储任何可序列化类型并以其强类型检索它的映射。序列化和反序列化也不需要消费者实现自定义 serde 逻辑。
使用方法
将以下内容添加到 Cargo.toml
type_reg = { version = "0.7.0", features = ["tagged"] }
type_reg = { version = "0.7.0", features = ["untagged"] }
# Values must impl Debug, and TypeMap's Debug impl will
# print the debug string of each value.
type_reg = { version = "0.7.0", features = ["debug"] }
# Use insertion order for TypeMap and TypeReg iteration order.
type_reg = { version = "0.7.0", features = ["ordered"] }
未标记类型注册表
序列化
use serde::{Deserialize, Serialize};
use type_reg::untagged::TypeMap;
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);
fn main() {
let mut type_map = TypeMap::new();
type_map.insert("one", 1u32);
type_map.insert("two", 2u64);
type_map.insert("three", A(3));
println!("{}", serde_yaml::to_string(&type_map).unwrap());
// ---
// two: 2
// one: 1
// three: 3
}
反序列化
use serde::{Deserialize, Serialize};
use type_reg::untagged::{TypeMap, TypeReg};
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);
fn main() {
let mut type_reg = TypeReg::<String>::new();
type_reg.register::<u32>(String::from("one"));
type_reg.register::<u64>(String::from("two"));
type_reg.register::<A>(String::from("three"));
let serialized = "---\n\
one: 1\n\
two: 2\n\
three: 3\n\
";
let deserializer = serde_yaml::Deserializer::from_str(serialized);
let type_map: TypeMap<String> = type_reg.deserialize_map(deserializer).unwrap();
let data_u32 = type_map.get::<u32, _>("one").copied().unwrap();
let data_u64 = type_map.get::<u64, _>("two").copied().unwrap();
let data_a = type_map.get::<A, _>("three").copied().unwrap();
println!("{data_u32}, {data_u64}, {data_a:?}");
// 1, 2, A(3)
}
标记类型注册表
⚠️ 注意: 此处内部使用 std::any::type_name
,该功能目前不稳定。
序列化
use serde::{Deserialize, Serialize};
use type_reg::tagged::TypeMap;
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);
fn main() {
let mut type_map = TypeMap::new();
type_map.insert("one", 1u32);
type_map.insert("two", 2u64);
type_map.insert("three", A(3));
println!("{}", serde_yaml::to_string(&type_map).unwrap());
// ---
// one:
// u32: 1
// three:
// "rust_out::A": 3
// two:
// u64: 2
}
反序列化
use serde::{Deserialize, Serialize};
use type_reg::tagged::{TypeMap, TypeReg};
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);
fn main() {
let mut type_reg = TypeReg::new();
type_reg.register::<u32>();
type_reg.register::<u64>();
type_reg.register::<A>();
let serialized = "---\n\
one: { u32: 1 }\n\
two: { u64: 2 }\n\
three: { 'tagged_deserialize_map::A': 3 }\n\
";
let deserializer = serde_yaml::Deserializer::from_str(serialized);
let type_map: TypeMap<String> = type_reg.deserialize_map(deserializer).unwrap();
let data_u32 = type_map.get::<u32, _>("one").copied().unwrap();
let data_u64 = type_map.get::<u64, _>("two").copied().unwrap();
let data_a = type_map.get::<A, _>("three").copied().unwrap();
println!("{data_u32}, {data_u64}, {data_a:?}");
// 1, 2, A(3)
}
许可证
根据您的选择,许可如下
- Apache 许可证第 2 版 (LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则您有意提交的任何贡献,根据 Apache-2.0 许可证定义,将按照上述方式双重许可,而无需任何额外的条款或条件。
依赖关系
~0.8–1.9MB
~40K SLoC