Đặc điểm rỉ sét không hài lòng

Aug 17 2020

Tôi mới làm quen với gỉ và đã thử tìm kiếm trong stackoverflow cũng như đọc tài liệu về serde https://docs.serde.rs/serde/trait.Serialize.html và https://serde.rs/impl-serialize.html, nhưng tôi đã hơi lạc lối.

Tôi muốn sử dụng Tera để tạo html và cấu trúc tôi đang chuyển nó không có đặc điểm được serde::ser::Serializetriển khai và tôi đã cố gắng triển khai nó nhưng nó có vẻ không ổn.

Phụ thuộc Cargo.toml

serde = "1.0.115"
serde_derive = "1.0.115"
serde-xml-rs = "0.4.0"
tera = "0.7.2"

main.rs

extern crate tera;
#[macro_use]
extern crate serde_derive;
extern crate serde;

use tera::Context;
use serde::ser::{Serialize, SerializeStruct, Serializer};

#[derive(Serialize, Debug)]
struct Person {
    firstname: String,
    lastname: String,
    age: i32,
}

#[derive(Debug)]
struct Attendees {
    people: Vec<Person>,
    updatedOn: String,
    updatedBy: String,
}

impl Serialize for Attendees {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut s = serializer.serialize_struct("Person", 3)?;
        s.serialize_field("people", &self.people)?;
        s.serialize_field("updatedOn", &self.updatedOn)?;
        s.serialize_field("updatedBy", &self.updatedBy)?;
        s.end()
    }
}

fn main() {
   let mut context = Context::new();
   let mut peeps: Vec<Person> = Vec::new();
   let mut attendees = Attendees {
      people: peeps,
      updatedOn: String::from("today"),
      updatedBy: String::from("someone"),
   };
   context.add("attendees", &attendees);
}

trình biên dịch nói:

mytest % cargo run      
   Compiling mytest v0.1.0 (/home/mike/mytest)
error[E0277]: the trait bound `Attendees: serde::ser::Serialize` is not satisfied
  --> src/main.rs:44:29
   |
44 |    context.add("attendees", &attendees);
   |                             ^^^^^^^^^^ the trait `serde::ser::Serialize` is not implemented for `Attendees`

error: aborting due to previous error

Tôi rõ ràng đang thiếu một cái gì đó ... Bất cứ ai có thể vui lòng giúp đỡ?

Trả lời

6 yolenoyer Aug 17 2020 at 06:58

Đặc điểm bạn đã triển khai và đặc điểm mà lỗi đang đề cập đến không giống nhau, bởi vì chúng đề cập đến hai phiên bản khác nhau của serde.

[[package]]
name = "tera"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c37e2aaa53871f9c3722a20f8951fea0afd366955e11542a58feb71997c6d769"
dependencies = [
 "chrono",
 "error-chain",
 "glob",
 "humansize",
 "lazy_static 0.2.11",
 "pest",
 "regex",
 "serde 0.9.15",
 "serde_json",
 "slug",
 "url",
]

tera 0.7.2không sử dụng phiên bản 1.0.*của serde, nhưng 0.9.*.

Bạn có thể sử dụng tera mới hơn hoặc sử dụng phiên bản serde tương thích trong Cargo.toml của bạn:

[dependencies]
serde = "0.9.15"
serde_derive = "0.9.15"