首页 > 解决方案 > 无法在已实现的方法中序列化结构,因为“特性 `serde::Serialize` 没有为 `Self` 实现”

问题描述

extern crate serde;
extern crate serde_json;

#[macro_use]
extern crate serde_derive;

#[derive(Serialize)]
pub struct MyStruct<'a> {
    pub field1: &'a str,
    pub field2: &'a str,
}

pub trait MyTrait {
    fn payload_to_json(&self) -> String {
        serde_json::to_string(&self)
    }
    fn do_the_thing(&self) {
        println!(payload_to_json(&self));
    }
}

impl MyTrait for MyStruct<'_> {}

fn main() {
    let n = MyStruct {
        field1: "foo"
        field2: "bar"
    }

    n.do_the_thing();
}
// What I'm hoping for: { "field1": "foo", "field2": "bar" }

这给了我以下错误:

error[E0277]: the trait bound `Self: Serialize` is not satisfied
    --> src/main.rs:10:31
     |
10   |         serde_json::to_string(&self)
     |                               ^^^^^ the trait `Serialize` is not implemented for `Self`

我是 Rust 的新手,所以可能会遗漏一些简单的东西;唯一实现 MyTrait 的结构确实已经Serialize实现(除非我误解了 derived() 的作用),所以我认为编译器没有被告知......某处。有人可以帮忙吗?

标签: rust

解决方案


将您的特征绑定到Serialize

pub trait MyTrait: Serialize {
    fn payload_to_json(&self) -> String {
        serde_json::to_string(&self).expect("A valid json")
    }
    fn do_the_thing(&self) {
        println!("{}", self.payload_to_json());
    }
}

操场


推荐阅读