#multidimensional-array #array #serialization #multidimensional #serde #data-structures #source

no-std serde-ndim

Serde对自描述格式(如JSON)中任意维数数组的序列化和反序列化支持

4个稳定版本

新版本 2.0.2 2024年8月19日
1.1.0 2023年4月28日
1.0.0 2023年4月2日

#347 in 编码

Download history 28/week @ 2024-04-27 49/week @ 2024-05-04 14/week @ 2024-05-11 16/week @ 2024-05-18 22/week @ 2024-05-25 35/week @ 2024-06-01 14/week @ 2024-06-08 21/week @ 2024-06-15 43/week @ 2024-06-22 5/week @ 2024-06-29 13/week @ 2024-07-06 26/week @ 2024-07-13 12/week @ 2024-07-20 16/week @ 2024-07-27 22/week @ 2024-08-03 7/week @ 2024-08-10

每月 60 次下载
2 个crates中使用(通过 ascom-alpaca

MIT 许可证

26KB
458

serde-ndim

Crates.io Documentation

概述

此crate提供了一种从自描述格式(如JSON)序列化和反序列化任意维度数组的方法,其中不提供有关结果数组形状的任何外部数据。

这对于某些数据源(例如在天文应用中)很有用,但不是内置的Serde集成(如流行crate的ndarraynalgebra)支持的格式。

考虑以下输入

[
    [
        [1, 2, 3, 4],
        [4, 5, 6, 7]
    ],
    [
        [7, 8, 9, 10],
        [10, 11, 12, 13]
    ],
    [
        [13, 14, 15, 16],
        [16, 17, 18, 19]
    ]
]

这应该反序列化为形状为 [3, 2, 4] 的三维数组。此crate提供了 serializedeserialize 函数,可以通过 #[serde)] 使用 #[serde)] 来实现这一点。

反序列化

反序列化的难点在于在读取数据时构建和学习内部一致性

  1. 在第一次下降过程中,它等待到达叶子数字(例如上面的示例中的 1)以确定维数(示例中的 3)。
  2. 它从第一步开始展开并读取序列 [1, 2, 3, 4],学习其长度(4)。现在它记得期望的形状为 [unknown, unknown, 4] - 它还没有看到更高维度的长度,但至少它知道有 3 个维度,最后一个维度长度为 4
  3. 它向上展开一步,递归到下一个序列,并读取 [4, 5, 6, 7]。这次它知道这不是第一次下降到这个维度,所以它不是学习它,而是将新的长度与存储的长度进行验证(4 == 4,一切良好)。
  4. 它到达了这个序列序列的末尾,所以现在它知道并存储期望的形状为 [unknown, 2, 4]
  5. 通过重复这个过程,它最终学会了并验证了整个数组的形状为 [3, 2, 4]
  6. 在此期间,它将原始数字收集到一个扁平的 Vec<_> 中,作为多维数组的优化存储。现在它只需要调用一个函数,该函数可以从形状和平展数据构造多维数组。

注意:结果数组将以标准列主序布局。

ndarraynalgebra 功能下提供了 ndarray::Arraynalgebra::DMatrix 的构造函数,因此您可以使用它们如下

use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
struct MyStruct {
    #[serde(with = "serde_ndim")]
    ndarray: ndarray::ArrayD<f32>,
    /* ... */
}

您还可以通过实现 serde_ndarray::de::MakeNDim 特性来重用自定义类型的反序列化。

序列化

序列化也提供了。它的实现要简单得多,所以这里不会详细介绍,如果您想查看代码,请随意。

此功能也适用于 ndarray::Arraynalgebra::DMatrix,但如果你想要序列化自定义类型,可以通过实现 serde_ndarray::ser::NDim 接口来实现。

依赖项

~0.1–1.4MB
~27K SLoC