当前位置: 首页 > 知识库问答 >
问题:

Serialize/Deserialize CSV with nested enum/struct with serde in Rust

刁英朗
2023-03-14

我想序列化/反序列化具有可变行长度和内容的CSV文件,如下所示:

/test.csv

Message,20200202T102030,Some message content
Measurement,20200202T102031,10,30,40,2
AnotherMeasurement,20200202T102034,0,2

在我看来,最简单的表示方法是下面的< code>enum:

#[derive(Debug, Serialize, Deserialize)]
pub enum Record {
    Message { timestamp: String, content: String }, // timestamp is String because of simplicity
    Measurement { timestamp: String, a: u32, b: u32, c: u32, d: u32 },
    AnotherMeasurement { timestamp: String, a: u32, b: u32 },
}

Cargo.toml

[dependencies]¬
csv = "^1.1.6"¬
serde = { version = "^1", features = ["derive"] }

运行以下命令

梅因

fn example() -> Result<(), Box<dyn Error>> {
    let mut rdr = csv::ReaderBuilder::new()
        .has_headers(false)
        .delimiter(b',')
        .flexible(true)
        .double_quote(false)
        .from_path("./test.csv")
        .unwrap();
    for result in rdr.deserialize() {
        let record: Record = result?;
        println!("{:?}", record);
    }
    Ok(())
}

fn write_msg() -> Result<(), Box<dyn Error>> {
    let msg = Record::Message {
        timestamp: String::from("time"),
        content: String::from("content"),
    };
    let mut wtr = csv::WriterBuilder::new()
        .has_headers(false)
        .flexible(true)
        .double_quote(false)
        .from_writer(std::io::stdout());
    wtr.serialize(msg)?;
    wtr.flush()?;
    Ok(())
}

fn main() {
    if let Err(err) = example() {
        println!("error running example: {}", err);
    }
    if let Err(err) = write_msg() {
        println!("error running example: {}", err);
    }
}

指纹

error running example: CSV deserialize error: record 0 (line: 1, byte: 0): invalid type: unit variant, expected struct variant
error running example: CSV write error: serializing enum struct variants is not supported

使用serdecsv,是否有简单的解决方案?我觉得我遗漏了一两个<code>serde</code>属性,但在文档中还没有找到正确的属性。

编辑

Netwave建议添加#[serde(tag=“type”)]属性。序列化现在可以工作了,反序列化会出现以下错误:

error running example: CSV deserialize error: record 0 (line: 1, byte: 0): invalid type: string "Message", expected internally tagged enum Record

我做的研究还没有找到解决办法

有没有办法在 Rust 中“扁平化”用于(反)序列化的枚举?

https://docs.rs/csv/1.1.6/csv/tutorial/index.html

枚举类型的自定义serde序列化

https://serde.rs/enum-representations.html

共有1个答案

葛季萌
2023-03-14

使你的枚举标记(内部标记具体):

#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Record {
    Message { timestamp: String, content: String }, // timestamp is String because of simplicity
    Measurement { timestamp: String, a: u32, b: u32, c: u32, d: u32 },
    AnotherMeasurement { timestamp: String, a: u32, b: u32 },
}

游乐场

 类似资料:
  • 描述 (Description) serialize( )方法将一组输入元素序列化为一串数据。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>$</i>.serialize( ) 参数 (Parameters) 以下是此方法使用的所有参数的说明 - NA 例子 (Example) 假设我们在serialize.php文件中有以下PHP内容 - <?php if( $_REQUES

  • ALERT This plugin does not work with any current release of jQuery. It will work after revision 5826 with no changes. Prior to that it will require you to modify serializeArray() to query the existenc

  • Serialize-javascript 能够序列化 JavaScript 库成含有正则表达式和功能的 JSON 包。 示例: var serialize = require('serialize-javascript');serialize({    str  : 'string',    num  : 0,    obj  : {foo: 'foo'},    arr  : [1, 2, 3]

  • Like PHP Serialize and Unserialize Functions. Sample: var Test = Array(); Test[-8.52] = 'fff'; Test['tt'] = Array(); Test['tt']['sss'] = 123; Test['ss'] = 'def'; Test['tt'][10] = 'abc'; ser = $.phpSer

  • Serialize 强制一个Observable连续调用并保证行为正确 一个Observable可以异步调用它的观察者的方法,可能是从不同的线程调用。这可能会让Observable行为不正确,它可能会在某一个onNext调用之前尝试调用onCompleted或onError方法,或者从两个不同的线程同时调用onNext方法。使用Serialize操作符,你可以纠正这个Observable的行为,保

  • 问题内容: 我的问题很基本。 我没有找到任何例子来满足我的需求,究竟和平均在PHP?他们只是给出一个示例- 序列化数组并以无法解释的格式显示输出。很难理解其术语所经过的基本概念。 编辑: 输出: 我不明白第二个输出。除此之外,有人可以举例说明在使用它之前我需要序列化php数组的情况吗? 问题答案: 一个PHP数组或对象或其他 复杂的数据结构 不能在 运行的PHP脚本 外传输或存储或以其他方式使用。

  • Serialize and Deserialize Binary Tree 描述 Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitt

  • 尝试序列化 和serde_with,我不知道该往哪里走。 我真的非常感谢任何帮助。