首页 > 解决方案 > 我可以在不手动实现序列化或反序列化的情况下序列化字段子集并使用函数反序列化其他字段吗?

问题描述

我有以下结构

struct S {
    value: f32,
    square: f32,
}

我想squarevaluenew(value)

impl S {
    fn new(value: f32) -> Self {
        Self { value, square: value.powi(2) }
    }
}

我可以value仅使用字段来序列化结构并使用new(value)反序列化整个事物而无需手动实现Serialize/Deserialize特征吗?

标签: rustserde

解决方案


您可以使用该#[serde(from = "FromType")]属性实现反序列化。如果转换可以失败,还有try_from属性。

通过反序列化为 反序列化此类型FromType,然后转换。这种类型必须实现From<FromType>,而且FromType必须实现Deserialize

序列化字段子集可以通过#[serde(skip)]在要省略的字段上应用注释来实现。

应用于您的用例,解决方案如下所示:

#[derive(Debug, Serialize, Deserialize)]
#[serde(from = "DeserS")]
struct S {
    value: f32,
    #[serde(skip)]
    square: f32,
}

#[derive(Deserialize)]
struct DeserS {
    value: f32,
}

impl From<DeserS> for S {
    fn from(tmp: DeserS) -> Self {
        Self {
            value: tmp.value,
            square: tmp.value.powi(2),
        }
    }
}

操场


推荐阅读