我可以序列化一部分字段并使用函数反序列化其他字段而无需手动实现序列化或反序列化吗?
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),
}
}
}
我有以下结构
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 implementFrom<FromType>
, andFromType
must implementDeserialize
.
可以通过在要省略的字段上应用 #[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),
}
}
}