2016-03-22 7 views
6

Serializeが派生したときに、serdeのシリアル化出力にメソッドの値を追加する方法はありますか?私は「仮想フィールド」のようなものを探しています。シリアル化出力をserdeするメソッドの値を追加

は私がSerializer/Visitor自分自身を定義するか、Valueを取得するためにserde_json::builderを使用することができます知って、私はちょうど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 } 
} 
+0

@Shepmaster:それはまだ冗長だし、それがこれを処理するための最良の方法であるかどうかは知りませんが、私はレコードのそれをここに追加するだろうと思いました!ラッパーを使用する簡単な例を追加しました。これがあなたの意味ですか?これはビルダーやシリアライザを定義するよりも簡単に簡単ですが、実際には理想的ではありません... –

答えて

3

は、私が今使っているものです。 、提案に感謝

#[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))) 
    } 
} 
関連する問題