首页 > 解决方案 > 如何使用 serde 序列化包含 ndarray 字段的结构?

问题描述

我对 Rust 比较陌生,但希望将它用于一些数字工作,并开始探索ndarray crate。serde::Serialize但是,这样做时,我在尝试派生和serde::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 = f64implementsSerialize和 sinceD = Dim<[usize; 1]>都实现了Dimensionand Serialize。为了为包含数组的结构派生序列化,我是否缺少一些东西?谢谢!

标签: rustserde

解决方案


最新版本ndarray0.13.1.

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

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

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


推荐阅读