1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
use crate::DashMap; use serde::de::{Deserialize, MapAccess, Visitor}; use serde::export::PhantomData; use serde::ser::{Serialize, SerializeMap, Serializer}; use serde::Deserializer; use std::fmt; use std::hash::Hash; pub struct DashMapVisitor<K, V> { marker: PhantomData<fn() -> DashMap<K, V>>, } impl<K, V> DashMapVisitor<K, V> where K: Eq + Hash, { fn new() -> Self { DashMapVisitor { marker: PhantomData, } } } impl<'de, K, V> Visitor<'de> for DashMapVisitor<K, V> where K: Deserialize<'de> + Eq + Hash, V: Deserialize<'de>, { type Value = DashMap<K, V>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a DashMap") } fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error> where M: MapAccess<'de>, { let map = DashMap::with_capacity(access.size_hint().unwrap_or(0)); while let Some((key, value)) = access.next_entry()? { map.insert(key, value); } Ok(map) } } impl<'de, K, V> Deserialize<'de> for DashMap<K, V> where K: Deserialize<'de> + Eq + Hash, V: Deserialize<'de>, { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { deserializer.deserialize_map(DashMapVisitor::<K, V>::new()) } } impl<K, V> Serialize for DashMap<K, V> where K: Serialize + Eq + Hash, V: Serialize, { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { let mut map = serializer.serialize_map(Some(self.len()))?; for ref_multi in self.iter() { map.serialize_entry(ref_multi.key(), ref_multi.value())?; } map.end() } }