polars_core/serde/
series.rs

1use std::io::{Read, Seek};
2
3use polars_utils::pl_serialize::deserialize_map_bytes;
4use serde::de::Error;
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6
7use crate::prelude::*;
8
9impl Series {
10    pub fn serialize_into_writer(&self, writer: &mut dyn std::io::Write) -> PolarsResult<()> {
11        let mut df =
12            unsafe { DataFrame::new_no_checks_height_from_first(vec![self.clone().into_column()]) };
13
14        df.serialize_into_writer(writer)
15    }
16
17    pub fn serialize_to_bytes(&self) -> PolarsResult<Vec<u8>> {
18        let mut buf = vec![];
19        self.serialize_into_writer(&mut buf)?;
20
21        Ok(buf)
22    }
23
24    pub fn deserialize_from_reader<T: Read + Seek>(reader: &mut T) -> PolarsResult<Self> {
25        let df = DataFrame::deserialize_from_reader(reader)?;
26
27        if df.width() != 1 {
28            polars_bail!(
29                ShapeMismatch:
30                "expected only 1 column when deserializing Series from IPC, got columns: {:?}",
31                df.schema().iter_names().collect::<Vec<_>>()
32            )
33        }
34
35        Ok(df.take_columns().swap_remove(0).take_materialized_series())
36    }
37}
38
39impl Serialize for Series {
40    fn serialize<S>(
41        &self,
42        serializer: S,
43    ) -> std::result::Result<<S as Serializer>::Ok, <S as Serializer>::Error>
44    where
45        S: Serializer,
46    {
47        use serde::ser::Error;
48
49        serializer.serialize_bytes(
50            self.serialize_to_bytes()
51                .map_err(S::Error::custom)?
52                .as_slice(),
53        )
54    }
55}
56
57impl<'de> Deserialize<'de> for Series {
58    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, <D as Deserializer<'de>>::Error>
59    where
60        D: Deserializer<'de>,
61    {
62        deserialize_map_bytes(deserializer, |b| {
63            let v = &mut b.as_ref();
64            let mut reader = std::io::Cursor::new(v);
65            Self::deserialize_from_reader(&mut reader)
66        })?
67        .map_err(D::Error::custom)
68    }
69}
70
71#[cfg(feature = "dsl-schema")]
72impl schemars::JsonSchema for Series {
73    fn schema_name() -> String {
74        "Series".to_owned()
75    }
76
77    fn schema_id() -> std::borrow::Cow<'static, str> {
78        std::borrow::Cow::Borrowed(concat!(module_path!(), "::", "Series"))
79    }
80
81    fn json_schema(generator: &mut schemars::r#gen::SchemaGenerator) -> schemars::schema::Schema {
82        Vec::<u8>::json_schema(generator)
83    }
84}