2016-03-22 7 views
6

C'è un modo per aggiungere il valore di un metodo all'output di serializzazione di serde quando la struct deriva Serialize? Sto cercando qualcosa come un "campo virtuale".Valore aggiunto di un metodo per l'output di serializzazione di serde

So che posso definire il mio Serializer/Visitor o utilizzare serde_json::builder per ottenere un Value, volevo solo controllare prima se ci fosse un modo per farlo utilizzando serde_macro magia.

essere chiaro che voglio qualcosa di simile:

#[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, grazie per il suggerimento! Ho appena aggiunto un semplice esempio di utilizzo di un wrapper: è questo che intendi? Questo è sicuramente più facile/più semplice della definizione di un generatore o serializzatore, ma non è proprio l'ideale ... –

risposta

3

Ecco quello che sto usando ora. E 'ancora verboso, e non so se è il modo migliore per gestire questa situazione, ma ho pensato che vorrei aggiungere che qui per la cronaca:

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