【问题标题】:Can I render a Template in Rocket with my own serialized struct?我可以使用自己的序列化结构在 Rocket 中渲染模板吗?
【发布时间】:2017-10-16 00:41:55
【问题描述】:

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

我做错了什么?

【问题讨论】:

    标签: rust serde rust-rocket


    【解决方案1】:

    当前版本的 Rocket v0.2.6 使用 serde = "^0.9" 而不是 serde 1.0。这意味着如果您在Cargo.toml 中说类似serde = "1" 的内容,cargo 将下载并链接两个不同版本的 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?)。这导致许多破损。为了解决这个问题,如果你想使用那个箱子,你需要在你的Cargo.toml 中说chrono = "=3.0"

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

    啊,没有什么比早上依赖地狱的味道更令人兴奋的了。

    【讨论】:

    • 谢谢,真的是地狱。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 2020-03-14
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多