为具有反序列化特征绑定的泛型的类型派生反序列化时,无法推断类型参数的类型

Tim*_*ost 6 rust

我使用可序列化和反序列化的泛型。但是,派生属性上存在错误,Deserialize表明无法推断类型。

结构体和枚举都会引发编译错误。评论其中之一不会解决任何问题。

use serde::{Deserialize, Serialize}; // 1.0.104

#[derive(Serialize, Deserialize)]
struct Jhon<A>
where
    A: Serialize + for<'a> Deserialize<'a>,
{
    foo: Foo<A>,
}

#[derive(Serialize, Deserialize)]
enum Foo<A>
where
    A: Serialize + for<'a> Deserialize<'a>,
{
    A,
    B(A),
}
Run Code Online (Sandbox Code Playgroud)
use serde::{Deserialize, Serialize}; // 1.0.104

#[derive(Serialize, Deserialize)]
struct Jhon<A>
where
    A: Serialize + for<'a> Deserialize<'a>,
{
    foo: Foo<A>,
}

#[derive(Serialize, Deserialize)]
enum Foo<A>
where
    A: Serialize + for<'a> Deserialize<'a>,
{
    A,
    B(A),
}
Run Code Online (Sandbox Code Playgroud)

操场

Tey*_*dge 6

你不需要特质界限。通常也不建议在结构上这样做。这段代码的工作原理:

#[derive(Clone, Serialize, Deserialize)]
struct Jhon<A> {
    foo: Foo<A>
}

#[derive(Clone, Serialize, Deserialize)]
enum Foo<A> {
    A,
    B(A)
}
Run Code Online (Sandbox Code Playgroud)

Rust 游乐场示例

当您使用其宏实现时, Serde 会自动尝试确定其边界Deserialize和实现。要使用自定义边界,您需要告诉 Serde 您正在使用属性来执行此操作。Serializederive#[serde(bound = "...")]

#[derive(Clone, Serialize, Deserialize)]
#[serde(bound = "A: Serialize + for<'a> A: Deserialize<'a>")]
struct Jhon<A>  where A:  Serialize + for<'a> Deserialize<'a>{
    foo: Foo<A>
}

#[derive(Clone, Serialize, Deserialize)]
#[serde(bound = "A: Serialize + for<'a> A: Deserialize<'a>")]
enum Foo<A>  where A: Serialize + for<'a> Deserialize<'a>, {
    A,
    B(A)
}
Run Code Online (Sandbox Code Playgroud)

Rust 游乐场示例