【问题标题】:How to serialise and deserialise BTreeMaps with arbitrary key types?如何用任意键类型序列化和反序列化 BTreeMaps?
【发布时间】:2020-07-19 07:30:52
【问题描述】:

此示例代码:

use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
struct Foo {
    bar: String,
    baz: Baz
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
enum Baz {
    Quux(u32),
    Flob,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
struct Bish {
    bash: u16,
    bosh: i8
}

fn main() -> std::io::Result<()> {
    let mut btree: BTreeMap<Foo, Bish> = BTreeMap::new();
    let foo = Foo {
        bar: "thud".to_string(),
        baz: Baz::Flob
    };
    let bish = Bish {
        bash: 1,
        bosh: 2
    };


    println!("foo: {}", serde_json::to_string(&foo)?);
    println!("bish: {}", serde_json::to_string(&bish)?);
    
    btree.insert(foo, bish);
    println!("btree: {}", serde_json::to_string(&btree)?);

    Ok(())
}

给出运行时输出/错误:

foo: {"bar":"thud","baz":"Flob"}
bish: {"bash":1,"bosh":2}
Error: Custom { kind: InvalidData, error: Error("key must be a string", line: 0, column: 0) }

我用谷歌搜索了这个,发现问题在于序列化程序会尝试写入:

{{"bar":"thud","baz":"Flob"}:{"bash":1,"bosh":2}}}

这不是有效的 JSON,因为键必须是字符串。

互联网告诉我编写自定义序列化程序。

这不是一个实际的选择,因为我有大量不同的非字符串键。

如何使 serde_json 序列化(和反序列化):

{"{\"bar\":\"thud\",\"baz\":\"Flob\"}":{"bash":1,"bosh":2}}

对于 BTreeMap 和 HashMap 中的任意非字符串键?

【问题讨论】:

    标签: rust hashmap serde btreemap


    【解决方案1】:

    在发现Rusty Object Notation后,我意识到我正在将一个RON形钉子推入一个JSON形孔中。

    正确的解决方案是使用 JSON 作为与外界的接口,使用 RON 作为人类可读的本地数据存储。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2022-07-06
      • 2021-12-03
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多