如何使用现有的 Display 特征实现来实现 Serialize?

ama*_*iny 5 rust serde

我希望Serialize在外部板条箱中的类型上实现该特征,但这是禁止的。我查看了 serde 的远程导出,但重写类型似乎需要做很多工作。

就我而言,我希望序列化的所有类型都实现该Display特征,并且对于序列化,我只想使用该特征。

我该怎么做呢?

ama*_*iny 9

这是我的尝试(注意:我是OP):

use serde::{Serialize, Serializer};
use std::io::Error;
use std::fmt::Display;

#[derive(Debug, Serialize)]
pub enum MyError {
    Custom,
    #[serde(serialize_with = "use_display")]
    Io(Error)
}

fn use_display<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
    T: Display,
    S: Serializer
{
    serializer.collect_str(value)
}
Run Code Online (Sandbox Code Playgroud)

操场

但也许有一种更直接的方法可以做到这一点?

  • 如果使用 crate 也是一种选择,[serde_with](https://crates.io/crates/serde_with) 提供“display_fromstr”,它使用 Display 实现进行序列化,使用 FromStr 实现进行反序列化。 (2认同)