如何使用现有的Display trait实施来实现序列化?

时间:2019-09-25 17:35:19

标签: rust serde

我希望在外部包装箱中的某个类型上实现Serialize特性,但禁止使用它。我看过Serde的remote derive,但似乎很多工作都在重写类型。

对于我来说,我要序列化的所有类型都实现了Display特征,而对于序列化,我只想使用该特征。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

这是我的尝试(注意:我是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)
}

playground

但是也许有更简单的方法吗?