Могу ли я визуализировать шаблон в 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`

Что я сделал не так?


person Alexsandr Startsev    schedule 16.05.2017    source источник


Ответы (2)


Текущая версия ракеты v0.2.6 использует serde = "^0.9", а не serde 1.0. Это означает, что если вы говорите что-то вроде serde = "1" в своем Cargo.toml, cargo загрузит и свяжет две разные версии serde. Это приводит к сообщению об ошибке.

Кроме того, из-за ошибки chrono разработчиков, chrono 3.1 использует serde 1.0, а chrono 3.0 использует serde 0.9. Но обновление зависимости до новой основной версии должно привести к резкому увеличению основной версии в самом ящике (связанном с: Что именно считается критическое изменение ящика библиотеки?). Это привело к множеству поломок. Чтобы справиться с этим, вам нужно сказать chrono = "=3.0" в вашем Cargo.toml, если вы хотите использовать этот ящик.

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

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

person Lukas Kalbertodt    schedule 16.05.2017
comment
Спасибо, это настоящий ад. - person Alexsandr Startsev; 17.05.2017

Как объяснил Лукас, есть некоторые проблемы с зависимостями. 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"
person manonthemat    schedule 17.05.2017