2016-03-22 9 views
6

पर किसी विधि का मान जोड़ें serde के क्रमिकरण आउटपुट में किसी विधि का मान जोड़ने का कोई तरीका है जब संरचना Serialize प्राप्त करती है? मैं "आभासी क्षेत्र" की तरह कुछ ढूंढ रहा हूं।serde serialization output

मैं जानता हूँ कि मैं अपने ही 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 } 
} 
+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))) 
    } 
} 
संबंधित मुद्दे