有没有办法将方法的值添加到serdestruct派生时的序列化输出Serialize?我正在寻找像"虚拟领域"这样的东西.
我知道我可以定义自己的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 }
}
Run Code Online (Sandbox Code Playgroud)
这是我现在使用的.它仍然很冗长,我不知道这是否是处理此问题的最佳方法,但我想我会在此处添加它以备记录:
#[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)))
}
}
Run Code Online (Sandbox Code Playgroud)