如何派生serde :::反序列化具有生命周期成员的结构

Vic*_*voy 5 lifetime rust serde

如何Deserialize为内部寿命不同或相等的对象派生结构?

操场

#[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() {
}
Run Code Online (Sandbox Code Playgroud)

Rustc说这是不可能的:

#[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() {
}
Run Code Online (Sandbox Code Playgroud)

我不知道是什么原因导致了这个问题以及如何解决。有一个类似的问题,但其答案并不涵盖这种情况。

Den*_*ret 5

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>,
}
Run Code Online (Sandbox Code Playgroud)