我可以使用自己的序列化结构在Rocket中渲染模板吗?

时间:2017-05-16 19:17:33

标签: rust serde rust-rocket

我正在使用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`

我做错了什么?

2 个答案:

答案 0 :(得分:3)

当前版本的火箭v0.2.6使用serde = "^0.9"而不是serde 1.0。这意味着如果您在serde = "1"中说Cargo.toml之类的内容,货物将下载并链接两个不同版本的serde。这会导致错误消息。

此外,由于chrono开发人员的错误,chrono 3.1使用serde 1.0,而chrono 3.0使用serde 0.9。但是将依赖项更新为新的主要版本应该会导致crate本身出现重大版本问题(相关:What exactly is considered a breaking change to a library 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的箱子。但这不应该花太长时间。然后,一切都应该再次有序。

啊,啊,没有什么比早上依赖地狱的气味更好了。

答案 1 :(得分:1)

就像Lukas解释的那样,存在一些依赖性问题。火箭实际上有upgraded to the newer Serde versions,但没有将更改作为新版本的Rocket推送到crates.io。因此,我建议告诉货物从GitHub拉出火箭及其相关的箱子。

下面提供了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"