gpt4 book ai didi

rust - 将方法的值添加到 serde 序列化输出

转载 作者:行者123 更新时间:2023-11-29 07:44:47 26 4
gpt4 key购买 nike

有没有办法在struct派生Serialize时,将方法的值添加到serde的序列化输出中?我正在寻找类似“虚拟领域”的东西。

我知道我可以定义自己的 Serializer/Visitor 或使用 serde_json::builder 来获取 Value,我只是想先检查是否有任何方法可以使用 serde_macro 魔法来做到这一点。

要明确一点,我想要这样的东西:

#[derive(Serialize, Deserialize, Debug)]
struct Foo {
bar: String,
#[serde(call="Foo::baz")]
baz: i32 // but this is not a real field
}

impl Foo {
fn baz(&self) -> i32 { self.bar.len() as i32 }
}

最佳答案

这是我现在用的。它仍然很冗长,我不知道这是否是处理此问题的最佳方式,但我想我会在此处添加它以供记录:

#[derive(Deserialize, Debug)]
struct Foo {
bar: String
}

impl Foo {
fn baz(&self) -> i32 { self.bar.len() as i32 }
}

impl ::serde::Serialize for Foo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer {

#[derive(Serialize)]
struct Extended<'a> {
bar: &'a String,
baz: i32
}

let ext = Extended {
bar: &self.bar,
baz: self.baz()
};

Ok(ext.serialize(serializer)?)
}
}

关于rust - 将方法的值添加到 serde 序列化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com