2 个版本
0.1.1 | 2023 年 5 月 3 日 |
---|---|
0.1.0 | 2023 年 5 月 3 日 |
#2163 在 编码
953 每月下载量
在 3 个包中使用 (通过 value-bag-serde1)
59KB
1.5K SLoC
serde_buf
类似于 serde_json::Value
,但不可见、可借用且格式无关。
请参阅文档获取更多详细信息。
lib.rs
:
为 serde
提供泛型缓冲。
该库提供 Owned
和 Ref
类型作为格式无关的 serde
缓冲区。缓冲区将保证以与原始来源完全相同的方式序列化。
获取拥有的缓冲区
任何实现了 serde::Serialize
的类型都可以缓冲到一个 Owned
缓冲区
use serde_buf::Owned;
// Imagine we have some owned resource...
thread_local! {
static SOME_THREAD_STATIC: RefCell<Option<Owned>> = RefCell::new(None);
}
// ...and some short-lived data
let short_lived: &'_ str = "A string";
// We can create an owned buffer from it...
let buffer = Owned::buffer(short_lived)?;
// ...and stash it in our owned resource
SOME_THREAD_STATIC.with(|ts| *ts.borrow_mut() = Some(buffer));
获取借用的缓冲区
借用的 Ref
缓冲区可能内部借用了字符串,这使得它们与 serde::Serialize
不兼容。您可以从任何底层源手动构建 [Ref
]
use serde_buf::Ref;
// Imagine we have some borrowed datatype
struct MyData<'a> {
id: u64,
content: &'a str,
}
// We can buffer it into a partially owned buffer manually
fn buffer_my_data<'a>(data: &'_ MyData<'a>) -> Ref<'a> {
Ref::record_struct("MyData", [
("id", Ref::u64(data.id)),
("content", Ref::str(data.content)),
])
}
序列化缓冲区
一旦您有了 Owned
或 Ref
缓冲区,您就可以使用它们自己的 serde::Serialize
实现来以某种格式进行编码
#[derive(Serialize)]
struct MyData<'a> {
id: u64,
content: &'a str,
}
let data = MyData {
id: 42,
content: "Some content",
};
let buffer = Owned::buffer(&data)?;
let data_json = serde_json::to_string(&data)?;
let buffer_json = serde_json::to_string(&buffer)?;
assert_eq!(data_json, buffer_json);
从缓冲区反序列化
值也可以通过它们的 serde::de::IntoDeserializer
实现将直接从 Owned
或 Ref
缓冲区反序列化
#[derive(Deserialize, Debug, PartialEq)]
struct MyData<'a> {
id: u64,
content: &'a str,
}
let data = MyData {
id: 42,
content: "Some content",
};
let buffer: Ref = buffer_my_data(&data);
let deserialized = MyData::deserialize(buffer.into_deserializer())?;
assert_eq!(data, deserialized);
直接到缓冲区的反序列化
类型 [Ref
] 和 Owned
未实现 serde::Deserialize
,因此不能直接反序列化。这是因为 serde
依赖于目标类型的提示来了解如何解释枚举变体。如果类型实现了 serde::Serialize
和 serde::Deserialize
,则可以先反序列化为该具体类型,然后再缓冲它
#[derive(Serialize, Deserialize)]
enum MyData<'a> {
Short(&'a str),
Full { id: u64, content: &'a str },
}
let json = data_json();
let buffer = Owned::buffer(&serde_json::from_str::<MyData>(&json)?)?;
依赖项
~110–355KB