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

Chr*_*ade 3 rust serde

我对 Rust 相当陌生,但希望将它用于一些数字工作,并开始探索ndarray箱。serde::Serialize然而,这样做时,我在尝试导出包含数组的结构时遇到了一些困难serde::Deserialize

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

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

#[derive(Serialize, Deserialize)]
pub struct Canary {
    pub xs: Array1<f64>
}
Run Code Online (Sandbox Code Playgroud)
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`
Run Code Online (Sandbox Code Playgroud)
# Cargo.toml
[dependencies]
ndarray = { version = "0.12.1", features = ["serde"] }
serde = { version = "1.0", features = ["derive"] }
Run Code Online (Sandbox Code Playgroud)

看看 上的边界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。为了导出包含数组的结构的序列化,我是否缺少某些东西?谢谢!

Ibr*_*med 7

的最新版本ndarray0.13.1.

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

[dependencies]
ndarray = { version = "0.13.1", features = ["serde"] }
Run Code Online (Sandbox Code Playgroud)

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