Могу ли я сделать шаблон в 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 ответа

Решение

Текущая версия ракеты, 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. Но обновление зависимости до новой основной версии должно привести к увеличению основной версии в самом ящике (связанному: что именно считается критическим изменением в ящике библиотеки?). Это привело ко многим поломкам. Чтобы справиться с этим, нужно сказать chrono = "=3.0" в вашем Cargo.toml если вы хотите использовать этот ящик.

Это, между прочим, именно то, что делает дизель 0.12, который также использует 0.9. Дизель 0.13 использует serde 1.0, поэтому он может зависеть от chrono = "^0.3.1", Таким образом, Rocket, вероятно, является последним ящиком, который должен перейти на serde 1.0. Но это не должно занять слишком много времени. Тогда все должно быть в порядке снова.

Ааа, ничто не сравнится с запахом ада зависимости по утрам.

Также как объяснил Лукас, есть некоторые проблемы с зависимостями. Rocket фактически обновился до более новых версий Serde, но не выдвигал изменения как новая версия 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"
Другие вопросы по тегам