Невозможно определить тип для параметра типа при получении десериализации для типа с обобщенным значением c с привязкой черты десериализации - PullRequest
0 голосов
/ 28 апреля 2020

Я использую универсальный c, который сериализуем и десериализуем. Однако есть ошибка в 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)

Детская площадка

1 Ответ

2 голосов
/ 28 апреля 2020

Вам не нужны границы черт. Это также, как правило, нежелательно делать на структурах. Этот код работает:

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

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

Пример Rust Playground

Serde автоматически пытается определить границы для реализаций Deserialize и Serialize при использовании его derive реализация макроса. Чтобы использовать пользовательские границы, нужно сообщить Серде, что вы делаете это, используя атрибут #[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)
}

Пример Rust Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...