//! Functions to serialize and deserialize an [`IndexMap`] as an ordered sequence. //! //! The default `serde` implementation serializes `IndexMap` as a normal map, //! but there is no guarantee that serialization formats will preserve the order //! of the key-value pairs. This module serializes `IndexMap` as a sequence of //! `(key, value)` elements instead, in order. //! //! This module may be used in a field attribute for derived implementations: //! //! ``` //! # use indexmap::IndexMap; //! # use serde_derive::{Deserialize, Serialize}; //! #[derive(Deserialize, Serialize)] //! struct Data { //! #[serde(with = "indexmap::map::serde_seq")] //! map: IndexMap<i32, u64>, //! // ... //! } //! ```
use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor}; use serde::ser::{Serialize, Serializer};
use core::fmt::{self, Formatter}; use core::hash::{BuildHasher, Hash}; use core::marker::PhantomData;
usecrate::map::Slice as MapSlice; usecrate::serde::cautious_capacity; usecrate::set::Slice as SetSlice; usecrate::IndexMap;
/// Serializes a [`map::Slice`][MapSlice] as an ordered sequence. /// /// This behaves like [`crate::map::serde_seq`] for `IndexMap`, serializing a sequence /// of `(key, value)` pairs, rather than as a map that might not preserve order. impl<K, V> Serialize for MapSlice<K, V> where
K: Serialize,
V: Serialize,
{ fn serialize<T>(&self, serializer: T) -> Result<T::Ok, T::Error> where
T: Serializer,
{
serializer.collect_seq(self)
}
}
/// Serializes a [`set::Slice`][SetSlice] as an ordered sequence. impl<T> Serialize for SetSlice<T> where
T: Serialize,
{ fn serialize<Se>(&self, serializer: Se) -> Result<Se::Ok, Se::Error> where
Se: Serializer,
{
serializer.collect_seq(self)
}
}
/// Serializes an [`IndexMap`] as an ordered sequence. /// /// This function may be used in a field attribute for deriving [`Serialize`]: /// /// ``` /// # use indexmap::IndexMap; /// # use serde_derive::Serialize; /// #[derive(Serialize)] /// struct Data { /// #[serde(serialize_with = "indexmap::map::serde_seq::serialize")] /// map: IndexMap<i32, u64>, /// // ... /// } /// ``` pubfn serialize<K, V, S, T>(map: &IndexMap<K, V, S>, serializer: T) -> Result<T::Ok, T::Error> where
K: Serialize,
V: Serialize,
T: Serializer,
{
serializer.collect_seq(map)
}
/// Visitor to deserialize a *sequenced* `IndexMap` struct SeqVisitor<K, V, S>(PhantomData<(K, V, S)>);
impl<'de, K, V, S> Visitor<'de> for SeqVisitor<K, V, S> where
K: Deserialize<'de> + Eq + Hash,
V: Deserialize<'de>,
S: Default + BuildHasher,
{ type Value = IndexMap<K, V, S>;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.