rust - 为具有 Deserialize trait bound 的泛型派生 Deserialize 时,无法推断类型参数的类型

标签 rust

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

struct 和 enum 都会抛出编译错误。评论其中之一不会解决任何问题。

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),
}

error[E0283]: type annotations needed
 --> src/lib.rs:3:21
  |
3 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^ cannot infer type for type parameter `A`
  |
  = note: cannot resolve `A: _IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize<'de>`
  = note: required by `_IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize`
  = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0283]: type annotations needed
 --> src/lib.rs:3:21
  |
3 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^ cannot infer type for type parameter `A`
  |
  = note: cannot resolve `A: _IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize<'_>`
  = note: required because of the requirements on the impl of `_IMPL_DESERIALIZE_FOR_Jhon::_serde::de::Visitor<'de>` for `_IMPL_DESERIALIZE_FOR_Jhon::<impl _IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize<'de> for Jhon<A>>::deserialize::__Visitor<'de, A>`
  = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0283]: type annotations needed
  --> src/lib.rs:11:21
   |
11 | #[derive(Serialize, Deserialize)]
   |                     ^^^^^^^^^^^ cannot infer type for type parameter `A`
   |
   = note: cannot resolve `A: _IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize<'de>`
   = note: required by `_IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize`
   = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0283]: type annotations needed
  --> src/lib.rs:11:21
   |
11 | #[derive(Serialize, Deserialize)]
   |                     ^^^^^^^^^^^ cannot infer type for type parameter `A`
   |
   = note: cannot resolve `A: _IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize<'_>`
   = note: required because of the requirements on the impl of `_IMPL_DESERIALIZE_FOR_Jhon::_serde::de::Visitor<'de>` for `_IMPL_DESERIALIZE_FOR_Foo::<impl _IMPL_DESERIALIZE_FOR_Jhon::_serde::Deserialize<'de> for Foo<A>>::deserialize::__Visitor<'de, A>`
   = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)

Playground

最佳答案

你不需要特征边界。通常也不建议在结构上这样做。此代码有效:

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

#[derive(Clone, Serialize, Deserialize)]
enum Foo<A> {
    A,
    B(A)
}

Rust playground example

Serde 会自动尝试确定 Deserialize 的边界和 Serialize当您使用它时的实现 derive宏实现。要使用自定义边界,您需要使用 #[serde(bound = "...")] 告诉 Serde 您正在执行此操作。属性。
#[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)
}

Rust playground example

关于rust - 为具有 Deserialize trait bound 的泛型派生 Deserialize 时,无法推断类型参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61473323/

相关文章:

rust - 从回调中返回引用

rust - 是否可以仅为 Release模式调用 build.rs?

struct - 类型别名和元组结构有什么区别?

openssl - 如何使用 rust-openssl 创建与 `-starttls smtp` 等效的连接?

macros - 如何在宏中允许可选的尾随逗号?

rust - 如何在递归 std::ops::Deref 上绑定(bind)类型?

generics - Rust:实现通用特征时出现 E0562

rust - 为什么 Read::read 和 Read::read_exact 需要初始化传递给它们的缓冲区?

rust - Cargo 无法在 Windows 10 上编译 rust-qml

rust - 如何实现一个委托(delegate)给 HashMap::values() 的迭代器