我可以序列化一部分字段并使用函数反序列化其他字段而无需手动实现序列化或反序列化吗?

Can I serialize a subset of fields and use a function to deserialize the other fields without manually implementing Serialize or Deserialize?

我有以下结构

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

我想从 new(value) 中的 value 导出 square:

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

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

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

Deserialize this type by deserializing into FromType, then converting. This type must implement From<FromType>, and FromType must implement 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),
        }
    }
}

Playground