Rust 将方法的值添加到serde序列化输出
当结构派生时,是否有方法将方法的值添加到Rust 将方法的值添加到serde序列化输出,rust,Rust,当结构派生时,是否有方法将方法的值添加到serde的序列化输出中?我在找一个类似“虚拟场”的东西 我知道我可以定义自己的序列化程序/访问者,或者使用serde_json::builder来获取值,我只是想先检查一下是否有任何方法可以使用serde_宏magic来实现这一点 明确地说,我想要这样的东西: #[derive(Serialize, Deserialize, Debug)] struct Foo { bar: String, #[serde(call="Foo::baz"
serde
的序列化输出中?我在找一个类似“虚拟场”的东西
我知道我可以定义自己的序列化程序
/访问者
,或者使用serde_json::builder
来获取值
,我只是想先检查一下是否有任何方法可以使用serde_宏
magic来实现这一点
明确地说,我想要这样的东西:
#[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: &mut S) -> Result<(), 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(try!(ext.serialize(serializer)))
}
}
#[派生(反序列化、调试)]
结构Foo{
酒吧:字符串
}
impl-Foo{
fn baz(&self)->i32{self.bar.len()as i32}
}
impl::serde::为Foo序列化{
fn序列化(&self,序列化程序:&mut S)->结果
其中S:::serde::Serializer{
#[导出(序列化)]
结构Extended@Shepmaster,谢谢你的建议!我刚刚添加了一个使用包装器的简单示例--这就是你的意思吗?这肯定比定义生成器或序列化程序更容易/更简单,但实际上并不理想。。。