我已经创建了一个可以序列化Foo struct 的serialize_foo函数.

struct Foo(i32)<-Foo struct 如下.

Foo struct 用在另一个 struct Bar中,如下所示:

struct Bar {
  #[serde(serialize_with = "serialize_foo")]
  pub x: Foo,
  #[serde(serialize_with = "serialize_foo")]
  pub y: Option<Foo>
}

x字段可以用serialize_foo函数序列化,但y字段不能.这是因为它是Option.

如果有一个新的函数serialize_foo_option,我应该如何序列化一个Option,但如果该值是None,该函数会做什么?

推荐答案

解决这个问题有很多种方法,但这一种最适合我.

我创建了一个名为serialize_foo_option的新函数,如下所示:

pub fn serialize_foo_option<S>(
    maybe_foo: &Option<Foo>,
    serializer: S,
) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut map = serializer.serialize_map(some_len)?;
    if let Some(foo) = maybe_foo {
        map.serialize_entry("key", &foo)?;
    }
    map.end()
}

这样,如果提供了None,则不会序列化任何内容.

Rust相关问答推荐

rust 蚀将动力特性浇到混凝土 struct 上是行不通的

为什么幻影数据不能自动推断?

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

具有对同一类型的另一个实例的可变引用的

在使用#[NO_STD]时,如何在Rust中收到紧急消息?

告诉Rust编译器返回值不包含构造函数中提供的引用

如何go 除多余的(0..)在迭代中,当它不被使用时?

在铁 rust 中,如何一次只引用几件事中的一件?

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

带引脚和不带引脚的比较功能

为什么 Rust 字符串没有短字符串优化 (SSO)?

将多维数组转换为切片

是否可以通过可变引用推进可变切片?

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

为什么数组不像向量那样在 for 块之后移动?

Rust 函数指针似乎被borrow 判断器视为有状态的

如何创建递归borrow 其父/创建者的 struct ?

Cargo:如何将整个目录或文件包含在功能标志中?

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?

如何在 Rust 中使用特征标志来捕获多行代码?