#[cfg(feature = "serde")]
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[cfg(feature = "serde")]
use crate::Tensor;
#[cfg(feature = "serde")]
#[derive(Serialize, Deserialize)]
struct TensorSerde {
shape: Vec<usize>,
data: Vec<f64>,
}
#[cfg(feature = "serde")]
impl Serialize for Tensor {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
#[cfg(feature = "dynamic")]
if self.is_dynamic() {
return Err(serde::ser::Error::custom(
"matten: dynamic tensors cannot be serialized with the default serde implementation; call try_numeric() first to convert to a numeric tensor, or use to_elements() to handle Element values manually",
));
}
TensorSerde {
shape: self.shape().to_vec(),
data: self.to_vec(),
}
.serialize(serializer)
}
}
#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for Tensor {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let ts = TensorSerde::deserialize(deserializer)?;
Tensor::try_new(ts.data, &ts.shape).map_err(serde::de::Error::custom)
}
}