1#[cfg(feature = "serde")]
17use crate::Tensor;
18#[cfg(feature = "serde")]
19use serde::{Deserialize, Deserializer, Serialize, Serializer};
20#[cfg(feature = "serde")]
22#[derive(Serialize, Deserialize)]
23struct TensorSerde {
24 shape: Vec<usize>,
25 data: Vec<f64>,
26}
27
28#[cfg(feature = "serde")]
29impl Serialize for Tensor {
30 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
31 #[cfg(feature = "dynamic")]
32 if self.is_dynamic() {
33 return Err(serde::ser::Error::custom(
34 "matten: dynamic tensors cannot be serialized with the default serde \
35 implementation; call try_numeric() first to convert to a numeric \
36 tensor, or use to_elements() to handle Element values manually",
37 ));
38 }
39 TensorSerde {
40 shape: self.shape().to_vec(),
41 data: self.to_vec(),
42 }
43 .serialize(serializer)
44 }
45}
46
47#[cfg(feature = "serde")]
48impl<'de> Deserialize<'de> for Tensor {
49 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
50 let ts = TensorSerde::deserialize(deserializer)?;
51 Tensor::try_new(ts.data, &ts.shape).map_err(serde::de::Error::custom)
52 }
53}