【问题标题】:Compiler says: the trait bound `Foo: serde::de::Deserialize` is not satisfied - when it is编译器说:特征绑定 `Foo: serde::de::Deserialize` 不满足 - 当它满足时
【发布时间】:2021-06-23 10:10:57
【问题描述】:

我努力将我的结构保存到用户偏好中。我的代码如下

use serde::{Serialize, Deserialize};
use preferences::AppInfo;

const APP_INFO: AppInfo = AppInfo{name: "some-name", author: "some-author"};
#[derive(Serialize, Deserialize, PartialEq, Debug)]
pub struct Foo {
    bar: i32
}

fn main() {
    let x = Foo{bar: 12};

    // Attempt 1: cannot find a `save` function
    // x.save(x, &APP_INFO, "foo/bar").unwrap();

    // Attempt 2: Foo leaves Serialize & Deserialise unsatisfied
    preferences::Preferences::save(&x, &APP_INFO, "foo/bar").unwrap();

}

尽管有这行 #[derive(Serialize, Deserialize, PartialEq, Debug)] 编译器抱怨..

error[E0277]: the trait bound `Foo: serde::ser::Serialize` is not satisfied
   --> src/main.rs:17:5
    |
17  |     preferences::Preferences::save(&x, &APP_INFO, "foo/bar").unwrap();
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `serde::ser::Serialize` is not implemented for `Foo`
    | 
   ::: /Users/martincowie/.cargo/registry/src/github.com-1ecc6299db9ec823/preferences-1.1.0/src/lib.rs:302:16
    |
302 |     fn save<S: AsRef<str>>(&self, app: &AppInfo, key: S) -> Result<(), PreferencesError>;
    |                ---------- required by this bound in `save`
    |
    = note: required because of the requirements on the impl of `Preferences` for `Foo`

unsatisfied trait bound &lt;S: AsRef&lt;str&gt;&gt; 与参数key 相关,它是一个字符串字面量。

这或多或少受到https://docs.rs/preferences/1.1.0/preferences/ 示例的启发

我需要做什么来安抚编译器?

【问题讨论】:

  • 哇,那个错误信息!它不仅声称Foo 没有实现SerializeDeserialize,而且没有解释版本冲突。它还声称某些特征绑定到完全不同的参数和完全不同的特征以某种方式导致Foo 需要实现SerializeDeserialize 的要求。这很随机。

标签: rust


【解决方案1】:

检查您的 cargo.lock。很可能,您的主应用程序正在拉入与 preferences 板条箱不同版本的 serde

似乎preferences 依赖于serde-0.9,但您很可能会加入serde-1.0。这意味着您的结构实现了serde-1.0::Deserialize,但preferences 想要serde-0.9::Deserialize

编译器无法为这种情况生成一个好的消息是一个长期存在的错误。

【讨论】:

  • 感谢 Seb,它解决了这个问题,但又导致了另一个问题。我还依赖于csv v1.1.6,它依赖于serde 1.0.125,因此将我的依赖关系更改为serde 的早期版本会扰乱csv。有没有优雅的解决方案?
  • serde 是您的依赖图中应该只有一个实例的板条箱之一,并且该单个实例应该是版本 1.x,因为几乎所有板条箱都使用该版本。 preferences crate 似乎已被废弃——最后一个版本是四年多前发布的。您最好的选择是为您的用例使用不同的 crate(很可能存在),或者自己将旧的 preferences crate 移植到 serde 1.0(这很可能没什么用)。
  • 谢谢斯文。我的工作解决方案是从github.com/baysmith/preferences-rs.git 获取preferences 而不是crates.io,这感觉错误 但确实有效。我同意 preferences 感觉被遗弃了 - 是否有在 crates.io 上标记它的过程或新维护者刷新它的过程?
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2021-03-28
  • 2021-11-29
  • 2021-02-04
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多