我正在使用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`
我做错了什么?
答案 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
。
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"