首页 > 解决方案 > 如何声明包含任何类型的可反序列化/可序列化结构的结构?

问题描述

我正在尝试声明一个结构,该结构包含任何给定类型的另一个结构,可以是Deserializeand Serialize

#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T: Deserialize + Serialize> {
    pub data: T,
}

锈操场

为此,我尝试使用 trait bound,使用诸如DeserializeOwnedor之类的特征Deserialize。两者都在编译时失败,并出现以下错误:

error[E0283]: type annotations required: cannot resolve `T: serde::Deserialize<'de>`
 --> src/main.rs:9:28
  |
9 | #[derive(Debug, Serialize, Deserialize)]
  |                            ^^^^^^^^^^^
  |
  = note: required by `serde::Deserialize`
error[E0637]: `&` without an explicit lifetime name cannot be used here
  --> src/main.rs:10:19
   |
10 | pub struct Foo<T: Deserialize + Serialize> {
   |                   ^^^^^^^^^^^ explicit lifetime name needed here

我在尝试增加生命周期时遇到了错误,因为我没有使用存储引用而是存储值。

声明这种结构的最惯用的方式是什么?

标签: rustserde

解决方案


多亏了 Rust Discord 的成员,我找到了一个解决方案,他向我推荐了以下 Github问题。诀窍不是使用特征边界,而是使用属性边界。

#[derive(Debug, Serialize, Deserialize)]
pub struct Foo<T> {
    #[serde(bound(
        serialize = "T: Serialize",
        deserialize = "T: Deserialize<'de>",
    ))]
    pub data: T,
}

推荐阅读