为serde序列化输出添加方法的值

Jac*_*own 9 rust

有没有办法将方法的值添加到serdestruct派生时的序列化输出Serialize?我正在寻找像"虚拟领域"这样的东西.

我知道我可以定义自己的Serializer/ Visitorserde_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)

Jac*_*own 6

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

#[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)