在运行时使用“skip_serializing_if”跳过序列化?

Skip serializing at runtime with `skip_serializing_if`?

提问人:Marco 提问时间:7/29/2023 最后编辑:cafce25Marco 更新时间:7/29/2023 访问量:71

问:

我阅读了有关 serde::skip_serializing_if 的信息,我想将其应用到我的项目中,但是我没有找到在运行时读取值的方法(想象一个标志)。--ignore-practices

我尝试使用静态值但没有成功......

请参阅下面的示例。

#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct IP {
    pub name: String,
    #[serde(skip_serializing_if = "read_flag_from_command_line")]
    pub practices: Option<Practices>,
}

fn is_false<T>(_: T) -> bool {
    let ignore = value_at_run_time;
    return ignore;
}
rust 序列化 serde serde-json

评论


答:

3赞 cafce25 7/29/2023 #1

这不是工作方式或用途,赋予它的函数必须将字段作为参考,并应根据此确定其结果。skip_serializing_if

话虽如此,你可以编写一个依赖于全局状态的函数来确定它是否序列化为黑客:

static SERIALIZE_PRACTICES: AtomicBool = AtomicBool::new(false);

fn dont_serialize_practices<T>(_: &T) -> bool {
    !SERIALIZE_PRACTICES.load(Ordering::Acquire)
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct Ip {
    #[serde(skip_serializing_if = "dont_serialize_practices")]
    pub practices: Option<String>,
}

操场

评论

0赞 Marco 7/29/2023
谢谢。如果可能的话,你能详细说明“这不是skip_serializing_if的工作方式或它的用途”吗?
0赞 cafce25 7/29/2023
好吧,由于它提供的接口和全局变量通常不受欢迎,因此不难看出它的主要用例是跳过字段默认值的序列化。