2

我正在使用Rocket,我正在尝试创建一个Layout结构。我已经实现serde::Serialize了,因为文档说静态方法Template::render的第二个参数接受一个实现的结构Serialize

struct Layout {
    data: String,
    second: String,
}

impl Layout {
    fn new(data: String, second: String) -> Layout {
        Layout { data, second }
    }

    fn render(&self) -> Template {
        Template::render("Layout", &self)
    }
}

impl Serialize for Layout {
    fn serialize<S>(&self, serialize: S) -> Result<S::Ok, S::Error>
        where S: Serializer
    {
        let mut state = serializer.serialize_struct("Layout", 2);
        state.serialize_field("data", &self.data)?;
        state.serialize_field("second", &self.data)?;
        state.end()
    }
}

我得到错误

the trait `serde::ser::Serialize` is not implemented for `layout::Layout`

我做错了什么?

4

2 回答 2

3

当前版本的Rocketv0.2.6使用serde = "^0.9"但尚未使用 serde 1.0。这意味着如果你serde = "1"在你的Cargo.toml, cargo 中说类似的话,将下载并链接两个不同版本的 serde。这会导致错误消息。

此外,由于chrono开发人员的错误,chrono3.1 使用了 serde 1.0,而chrono3.0 使用了 serde 0.9。但是将依赖项更新到新的主要版本应该会导致 crate 本身发生主要版本的碰撞(相关:究竟什么被认为是对库 crate 的重大更改?)。这导致许多破损。为了解决这个问题,您需要在您的文件chrono = "=3.0"中说明您Cargo.toml是否要使用该板条箱。

顺便说一句,这正是柴油 0.12 正在做的事情,它也使用了 serde 0.9。Diesel 0.13 使用的是 serde 1.0,因此它可以依赖于chrono = "^0.3.1". 所以 Rocket 可能是最后一个需要过渡到 serde 1.0 的 crate。但这不应该再花太长时间了。然后,一切都应该恢复正常。

啊哈,没有什么比早上依赖地狱的味道更胜一筹了。

于 2017-05-16T21:36:52.100 回答
1

就像 Lukas 解释的那样,存在一些依赖性问题。Rocket 实际上已经升级到了较新的 Serde 版本,但并没有将更改作为 Rocket 的新版本推送到 crates.io。因此,我建议告诉 cargo 从 GitHub 中提取 Rocket 及其相关的 crate。

下面提供了 Cargo.toml 的示例依赖项部分:

[dependencies]
chrono = "0.3.1"
rocket = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_codegen = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket" }
serde = "1.0.2"
serde_json = "1.0.1"
serde_derive = "1.0.2"
于 2017-05-17T03:32:12.987 回答