rust - 我可以在不手动实现序列化或反序列化的情况下序列化字段子集并使用函数反序列化其他字段吗?
问题描述
我有以下结构
struct S {
value: f32,
square: f32,
}
我想square
从value
:new(value)
impl S {
fn new(value: f32) -> Self {
Self { value, square: value.powi(2) }
}
}
我可以value
仅使用字段来序列化结构并使用new(value)
反序列化整个事物而无需手动实现Serialize
/Deserialize
特征吗?
解决方案
您可以使用该#[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),
}
}
}
推荐阅读
- ruby-on-rails-5 - 如何跳过 before_action CASClient::Frameworks::Rails::Filter?
- javascript - 正则表达式删除javascript中重复的相邻字符
- git - Git推送到Github显示漏洞,但我已经更新了包并且信息页面是404
- google-apps-script - 如何根据日期值将一行移动到另一个工作表
- r - R函数对每年特定年龄的值求和
- css - 如何对齐a内的文本水平元素?
- python - 在被点击时发出 QTableWidgetItem 特定的信号
- go - How do decorate mux subrouter similar to http.Handler?
- javascript - React - 导入待办事项但我在文件中看不到它
- python - Python/TensorFlow/Keras - Input to reshape is a tensor with 300 values, but the requested shape has 200 [[{{node decoder_1/reshape_1/Reshape}}]]