polars_core/serde/
series.rs1use 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}