你能在rust中将stuct的向量序列化为TOML吗?

euoag5mw  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(134)

总结

我正在用rust写一个程序,我更喜欢用TOML文件来存储struct的矢量。但是我不知道如何在TOML文件中存储struct的矢量。我可以用JSON来做这件事,但是我希望使用TOML,所以只是确认我没有忽略什么(甚至不确定TOML格式是否能够支持我所需要的)。因此,我试图找出是否有人知道一种方法,使用rust将struct的向量序列化为TOML,更重要的是将其反序列化回向量。

错误消息(尝试反序列化时)

线程'main'在Err值上调用Result::unwrap()时死机:错误{内部:错误内部{类型:通缉犯{预期:“一个表键”,找到:“一个右括号”},行:点(0),col:2、at:有的(2)、留言:“",密钥:[] }}',源代码/主文件。rs:22:55注意:使用RUST_BACKTRACE=1环境变量运行以显示回溯

摘录自Cargo.toml

[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1.0.86"
toml = "0.5.9"

示例代码

链接到Playground上的代码

use serde::{Deserialize, Serialize};

# [derive(PartialEq, Debug, Serialize, Deserialize)]

struct Point {
    x: i32,
}

/// An ordered list of points (This is what I want to store in the TOML file)
type Points = Vec<Point>;

fn main(){
    // Create sample data to test on
    let original: Points = vec![Point { x: 1 }];

    // Working code that converts it to json and back
    let json = serde_json::to_string(&original).unwrap();
    let reconstructed: Points = serde_json::from_str(&json).unwrap();
    assert_eq!(original, reconstructed); // No panic

    // "Desired" code that converts it to toml but unable to deserialize
    let toml = toml::to_string(&original).unwrap();
    let reconstructed: Points = toml::from_str(&toml).unwrap(); // Panics!
    assert_eq!(original, reconstructed); 
}

toml::to_string(&original).unwrap()的输出

[[]]
x = 1

示例代码说明

在示例代码中,我创建了一些示例数据,然后将其转换为JSON,然后再转换回来,没有任何问题。它不会给予错误,但输出对我来说没有意义。然后我试着把它转换回一个rust向量,这就触发了错误。我最大的问题是我'我甚至不确定TOML文件将如何查找具有多个struct的向量的有效表示。

相关问题/研究

我找不到任何信息来创建一个有多个struct的向量,我能找到的最接近的是this question,虽然这个问题看起来应该能解决我的问题,但实际的问题是序列化枚举,因此解决方案引用了这个问题,并没有解决我的问题。

gojuced7

gojuced71#

在Toml中表示表数组的语法似乎是

[[points]]
x = 1
[[points]]
x = 2

因此,从Toml语法和原始死机错误Error { inner: ErrorInner { kind: Wanted { expected: "a table key", found: "a right bracket" }回溯:引入一个表示表键的 Package 结构可以解决这个问题。

use serde::{Deserialize, Serialize};

# [derive(PartialEq, Debug, Serialize, Deserialize)]

struct Point {
    x: i32,
}

# [derive(PartialEq, Debug,Serialize, Deserialize)]

struct Points {
    points: Vec<Point>
}

impl From<Vec<Point>> for Points {
    fn from(points: Vec<Point>) -> Self {
        Points {
            points
        }
    }
}

fn main(){
    let original: Points = vec![Point { x: 1 }, Point {x : 2}].into();

    let json = serde_json::to_string(&original).unwrap();
    let reconstructed: Points = serde_json::from_str(&json).unwrap();
    assert_eq!(original, reconstructed);

    let toml = toml::to_string(&original).unwrap();
    let reconstructed: Points = toml::from_str(&toml).unwrap();

    assert_eq!(original, reconstructed);
}

相关问题