2016-09-08 18 views
8

Serileştirmeden önce bir alana nasıl dönüşüm uygulayabilirim? Örneğin, bu yapı tanımında lat ve lon alanlarının serileştirilmeden önce en fazla 6 ondalık basamağa yuvarlatıldığından nasıl emin olabilirim?Serde kullanarak serileştirme sırasında alanlar nasıl dönüştürülür?

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

El 'Serialize' uygulanması:

diğer yarı kılavuzu yaklaşım otomatik türetilmiş seri ayrı yapı oluşturmak ve bu kullanarak seri uygulamaktır? – Kroltan

cevap

7

Sen alanı için a custom serialization function sağlamak serialize_with attribute kullanabilirsiniz:

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

(Ben konuyu önlemek için en yakın tam sayıya yuvarlanır ettik "k float yuvarlamak için en iyi yolu nedir ondalı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) 
    } 
}