2016-09-08 7 views
8

क्रमबद्ध करने से पहले मैं एक क्षेत्र में परिवर्तन कैसे लागू कर सकता हूं?Serde का उपयोग कर serialization के दौरान खेतों को बदलने के लिए कैसे?

उदाहरण के लिए, मैं यह कैसे सुनिश्चित कर सकता हूं कि इस संरचना परिभाषा में lat और lon फ़ील्ड धारावाहिक होने से पहले अधिकतम 6 दशमलव स्थानों पर गोल हो जाएं?

#[derive(Debug, Serialize)] 
struct NodeLocation { 
    #[serde(rename = "nodeId")] 
    id: u32, 
    lat: f32, 
    lon: f32, 
} 
+1

मैन्युअल लागू 'Serialize':

अन्य अर्द्ध मैनुअल दृष्टिकोण ऑटो व्युत्पन्न क्रमबद्धता के साथ एक अलग struct बनाते हैं, और का उपयोग कर कि अपने क्रमांकन लागू करने के लिए है? – Kroltan

उत्तर

7

आप serialize_with attribute उपयोग कर सकते हैं अपने क्षेत्र के लिए a custom serialization function प्रदान करने के लिए:

#[macro_use] 
extern crate serde_derive; 

extern crate serde; 
use serde::Serializer; 

fn round_serialize<S>(x: &f32, s: S) -> Result<S::Ok, S::Error> 
where 
    S: Serializer, 
{ 
    s.serialize_f32(x.round()) 
} 

#[derive(Debug, Serialize)] 
pub struct NodeLocation { 
    #[serde(rename = "nodeId")] 
    id: u32, 
    #[serde(serialize_with = "round_serialize")] 
    lat: f32, 
    #[serde(serialize_with = "round_serialize")] 
    lon: f32, 
} 

(मैं निकटतम पूर्णांक तक एकत्रित किए हैं विषय से बचने के लिए "k करने के लिए एक नाव दौर का सबसे अच्छा तरीका क्या है दशमलव स्थान")।

impl Serialize for NodeLocation { 
    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error> 
    where 
     S: Serializer, 
    { 
     // Implement your preprocessing in `from`. 
     RoundedNodeLocation::from(loc).serialize(s) 
    } 
} 
संबंधित मुद्दे