rust - 如何为具有生命周期成员的结构派生 serde::Deserialize

标签 rust lifetime serde

<分区>

如何为内部具有不同或相同生命周期的对象的结构派生反序列化

playground

#[derive(Default, Debug, serde::Deserialize, serde::Serialize)]
struct B<'a> {
    b: &'a str,
}

#[derive(Default, Debug, serde::Deserialize, serde::Serialize)]
struct C<'a> {
    c: &'a str,
}

#[derive(Default, Debug, serde::Deserialize, serde::Serialize)]
struct A<'a> {
    b: B<'a>,
    c: C<'a>,
}

fn main() {
}

Rustc 说这是不可能的:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` due to conflicting requirements
  --> src/main.rs:13:5
   |
13 |     b: B<'a>,
   |     ^
   |
note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 11:26...
  --> src/main.rs:11:26
   |
11 | #[derive(Default, Debug, serde::Deserialize, serde::Serialize)]
   |                          ^^^^^^^^^^^^^^^^^^
   = note: ...so that the types are compatible:
           expected _IMPL_SERIALIZE_FOR_B::_serde::de::SeqAccess<'_>
              found _IMPL_SERIALIZE_FOR_B::_serde::de::SeqAccess<'de>
note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 12:10...
  --> src/main.rs:12:10
   |
12 | struct A<'a> {
   |          ^^
   = note: ...so that the types are compatible:
           expected _IMPL_SERIALIZE_FOR_B::_serde::Deserialize<'_>
              found _IMPL_SERIALIZE_FOR_B::_serde::Deserialize<'_>

我不明白导致此问题的原因以及如何解决它。 有 a similar question但它的答案不包括这种情况。

最佳答案

serde 的生命周期非常复杂,允许您反序列化而无需复制不必要的数据。在 https://serde.rs/lifetimes.html 中进行了描述

除了&str&[u8],serde不接受隐式借用。

对于其他结构参数,如果你想从反序列化器中借用,你必须是显式的,这是使用特殊的#[serde(borrow)]属性完成的:

#[derive(Default, Debug, serde::Deserialize, serde::Serialize)]
struct A<'a> {

    #[serde(borrow)]
    b: B<'a>,

    #[serde(borrow)]
    c: C<'a>,
}

关于rust - 如何为具有生命周期成员的结构派生 serde::Deserialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57692768/

相关文章:

rust - 为什么 !Send 在 .await 之前被 drop() 丢弃的值意味着 Future 是 !Send?

rust - 如何返回带有 `&self` 的 future 组合器

rust - 如何使用Serde的SeqDeserializer将序列反序列化为自定义类型?

rust - serde如何将字符串中的值转换为类型

rust - 有没有办法使用 Rust 的 serde/serde_json 来 "patch"结构?

memory - 如何不安全地增加可变 byte slice 的大小?

rust - 为什么返回 Result 的函数总是返回 Err?

rust - 如何将结构设为非公开且不将其从 lib.rs 中移出?

rust - 从消耗值中计算出生命周期以供引用

c++ - 从函数返回的对象在不使用时是否仍然创建?