rust ndarray(反)序列化中的“v”代表什么?

o0lyfsai  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(142)

我试图理解ndarray(反)序列化中的“v”:

use ndarray::prelude::*;

pub fn example() {
    let ar2 = arr2(&[[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.]]);
    let s = serde_json::to_string(&ar2).unwrap();
    dbg!(s);
    
    let ar1 = arr1(&[[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.]]);
    let s = serde_json::to_string(&ar1).unwrap();
    dbg!(s);

    let anatoly = String::from("{\"v\":1,\"dim\":[3,3],\"data\":[1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0]}");
    let a = serde_json::from_str::<Array2<f64>>(&anatoly).unwrap();
    dbg!(a);
}

查看:https://docs.rs/ndarray/latest/src/ndarray/array_serde.rs.html#91-100它指的是某种ARRAY_FORMAT_VERSION
这个“版本”是什么?
它总是“1”吗(对于最新版本的lib)?

wgeznvg7

wgeznvg71#

是的,该字段表示序列化格式的版本。此时,该版本可能始终为1,但将来该格式可能改变。如果/当它改变时,该字段可用于确定如何反序列化数据而不管其来自哪个版本。它还为ndarray的单个版本提供了根据情况在单个类型的多个格式之间进行选择的选项。
举个例子,假设他们想添加一个额外的安全检查,在这个检查中,我们将数组值的类型嵌入到序列化数据中,以确保它被反序列化为相同的类型。

{"v":2,"type":"f64","dim":[3,3],"data":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]}

但是,在引入此更新后,由以前版本序列化的数据会发生什么变化?使用数据中的版本字段,我们可以知道阅读数据时使用哪种方法,并且仍然保持与以前格式的兼容性。
当然,这纯粹是一个假设性的例子,正如@IvanC在评论中指出的,他们可能希望实现一种打包的数据格式,而格式版本是未来证明的一种方式。

相关问题