如何使用 serde 序列化包含 ndarray 字段的结构?

How to use serde to serialize structs containing ndarray fields?

我是 Rust 的新手,但我想将它用于一些数字工作并开始探索 ndarray 箱子。但是,这样做时,我在尝试为包含数组的结构派生 serde::Serializeserde::Deserialize 时有点难过。

特别是,我尝试编译以下代码片段但在这样做时出错:

extern crate serde;
use ndarray::{ Array1 };
use serde::{ Serialize, Deserialize };

#[derive(Serialize, Deserialize)]
pub struct Canary {
    pub xs: Array1<f64>
}
error[E0277]: the trait bound `ndarray::ArrayBase<ndarray::OwnedRepr<f64>, ndarray::Dim<[usize; 1]>>: serde::Serialize` is not satisfied
  --> src/lib.rs:40:5
   |
40 |     pub xs: Array1<f64>
   |     ^^^ the trait `serde::Serialize` is not implemented for `ndarray::ArrayBase<ndarray::OwnedRepr<f64>, ndarray::Dim<[usize; 1]>>`
   |
   = note: required by `serde::ser::SerializeStruct::serialize_field`
# Cargo.toml
[dependencies]
ndarray = { version = "0.12.1", features = ["serde"] }
serde = { version = "1.0", features = ["derive"] }

查看 impl<A, D, S> Serialize for ArrayBase<S, D> where A: Serialize, D: Dimension + Serialize, S: Data<Elem = A> 上的边界,我对错误是什么感到有点困惑,因为 A = f64 实现了 Serialize,并且 D = Dim<[usize; 1]> 实现了DimensionSerialize。为了派生包含数组的结构的序列化,我缺少什么吗?谢谢!

ndarray的最新版本是0.13.1

更新您 Cargo.toml 中的版本应该可以解决问题:

[dependencies]
ndarray = { version = "0.13.1", features = ["serde"] }

这个答案是@Locke 在评论中提出的。我刚刚为未来的访客创建了一个小答案。