rust - 我得到的特征绑定(bind) `T: sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize` 不满意

标签 rust serde

我正在尝试用一个通用成员序列化一个 stuct 我收到错误 'required because of the requirements on the impl of sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize对于 sns_pub::Message<T>

#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(bound(
serialize = "T: Serialize",
deserialize = "T: Deserialize<'de>",
))]
struct Message<T> {
    topic: String,
    message_id: String,
    created_date: DateTime<Utc>,
    message: T,
    subject: String
}
let msg = String::from("TEST_MESSAGE"); 
let message = Message {
             topic: self.topic.clone(),
             message_id: id.to_string(),
             created_date: now,
             subject: self.subject.clone(),
             message: msg
         };
let filename = format!("{}/{}_{}", self.folder_path, prefix, id);
let mut file = File::create(filename.clone())?;
 file.write_all(serde_yaml::to_string(&message)?.as_str())?;
error[E0277]: the trait bound `T: sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize` is not satisfied
    --> src/sns_pub.rs:57:46
    | 
43  | impl<T> SnsPub<T> for DiskSnsPub {
    |      - help: consider restricting this bound: `T: sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize` ... 
57  |  file.write_all(serde_yaml::to_string(&message)?.as_str())?;
    |                                       ^^^^^^^^ the trait `sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize` is not implemented for `T`
    |     ::: /home/moharaza/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_yaml-0.8.11/src/ser.rs:421:8
    | 
421 |     T: ser::Serialize,
    |              -------------- required by this bound in `serde_yaml::ser::to_string`
    |
    = note: required because of the requirements on the impl of `sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize` for `sns_pub::Message<T>`

error[E0308]: mismatched types

最佳答案

提供的代码缺少很多信息,错误实际上是由您没有提供的代码引起的。这就是提供 [reprex] 很重要的原因。

但是,我可以猜测某些代码实际上来自 Message 的方法,因为它使用了 self。您错过的是定义方法的 impl block 的 T 边界:

impl<T> Message<T>
where
    T: Serialize + for<'de> Deserialize<'de>,
{
     /// methods go here 
{

我知道这一点,因为错误消息已经准确地告诉了您这一点。

关于rust - 我得到的特征绑定(bind) `T: sns_pub::_IMPL_DESERIALIZE_FOR_Message::_serde::Serialize` 不满意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983585/

相关文章:

hashmap - 对包含引用的临时值强制执行生存期

json - 如何通过属性将 JSON 对象数组整理成包含每个对象属性向量的结构?

json - 如何在不丢失任何值的情况下反序列化具有重复键的JSON?

string - 如何在不将换行符插入原始字符串的情况下包装原始字符串文字?

rust - `if` 具有自有和借入值的分支,没有 let 绑定(bind)

rust - 使用Box对结构进行反序列化

rust - Rust定制反序列化实现

rust - 使用 Serde 对数组或值数组进行自定义反序列化

rust - 当给出生命周期时,编译器在结构中询问生命周期

rust - 我如何使用-Zprofile为nostd内核生成代码覆盖率