gpt4 book ai didi

rust - 如何使用 serde 将结构序列化为另一个 Rust 数据结构?

转载 作者:行者123 更新时间:2023-11-29 08:17:36 25 4
gpt4 key购买 nike

我有一个数据结构 Document,我想将其他 Rust 结构序列化到它。它基本上是内部字段的 HashMap,但是它与数据库 API 交互,所以我肯定想将其他类型转换为那些 Document

例如这个结构

struct Entry {
id: String,
user: String,
duration: u32,
location: (f64, f64),
}

我已经使用 From 特性转换为 Document 类型,但是这是一个额外的地方,我必须在 Entry 结构变化。该实现使用 DocumentBuilder 并且如下所示:

impl From<Entry> for Document {
fn from(entry: Entry) -> Self {
Document::builder()
.name(&entry.id) // set the name of the document
.field("user", entry.user) // add fields ...
.field("duration", entry.duration)
.field("location", entry.location)
.build() // build a Document

}
}

field 方法可以将任何可以转换为 FieldValue 的值分配给键。所以field的签名是:

impl DocumentBuilder {
// ...
pub fn field<T: Into<FieldValue>>(mut self, key: &str, value: T) -> Self { ... }
// ...
}

我想使用 serde 及其派生功能自动将结构及其字段序列化为 Document。我该怎么做呢?我在 wiki 上查看了 Implementing a Serializer但是显示的示例写入字符串,我想知道如何使用构建器模式序列化为数据结构。

最佳答案

最简单的方法是使用 serde_json::from_value (即使您不使用 JSON 也适用,但要求所有字段都是有效的 JSON [例如 HashMap 中没有非字符串键]):

let entry = Entry {
a: 24,
b: 42,
c: "nice".to_string()
};
let v = serde_json::to_value(&entry).unwrap();
let document: Document = serde_json::from_value(v).unwrap();

警告:Document 的值类型必须实现Deserialize,并且可以将任何值反序列化为正确的参数。这可以通过使用#[serde(untagged)]来完成,但可能容易出现某些类型错误,例如u8被转换为u64.

Full playground example

不涉及任何不必要的副本的更复杂的方法将要求您编写自定义(反)序列化程序,一个不错的方法是 serde_transcode::transcode ,它执行与您想要的相反的操作 - 它在两种数据格式之间进行转换。

关于rust - 如何使用 serde 将结构序列化为另一个 Rust 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com