serialization - 为什么在使用带有结构变体的枚举手动实现的序列化序列化为 TOML 时出现 UnsupportedType 错误?

标签 serialization rust serde

我正在尝试为包含结构变体的枚举实现 Serializeserde.rs documentation指示如下:

enum E {
    // Use three-step process:
    //   1. serialize_struct_variant
    //   2. serialize_field
    //   3. end
    Color { r: u8, g: u8, b: u8 },

    // Use three-step process:
    //   1. serialize_tuple_variant
    //   2. serialize_field
    //   3. end
    Point2D(f64, f64),

    // Use serialize_newtype_variant.
    Inches(u64),

    // Use serialize_unit_variant.
    Instance,
}

考虑到这一点,我开始实现:

use serde::ser::{Serialize, SerializeStructVariant, Serializer};
use serde_derive::Deserialize;

#[derive(Deserialize)]
enum Variants {
    VariantA,
    VariantB { k: u32, p: f64 },
}

impl Serialize for Variants {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match *self {
            Variants::VariantA => serializer.serialize_unit_variant("Variants", 0, "VariantA"),
            Variants::VariantB { ref k, ref p } => {
                let mut state =
                    serializer.serialize_struct_variant("Variants", 1, "VariantB", 2)?;
                state.serialize_field("k", k)?;
                state.serialize_field("p", p)?;
                state.end()
            }
        }
    }
}

fn main() {
    let x = Variants::VariantB { k: 5, p: 5.0 };
    let toml_str = toml::to_string(&x).unwrap();
    println!("{}", toml_str);
}

代码可以编译,但是当我运行它时却失败了:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: UnsupportedType', src/libcore/result.rs:999:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

我想问题一定出在我对 API 的使用上,所以我查阅了 API documentation for StructVariant它看起来和我的代码几乎一样。我确定我遗漏了什么,但根据文档和输出我没有看到它。

最佳答案

为枚举启用外部标记使 Serde 能够将其序列化/反序列化为 TOML:

#[derive(Deserialize)]
#[serde(tag = "type")]
enum Variants {
    VariantA,
    VariantB { k: u32, p: f64 },
}

toml::to_string(&Variants::VariantB { k: 42, p: 13.37 })

序列化为

type = VariantB
k = 42
p = 13.37

这在 VecHashMap 中也很有效。

关于serialization - 为什么在使用带有结构变体的枚举手动实现的序列化序列化为 TOML 时出现 UnsupportedType 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560593/

相关文章:

rust - 返回通用函数指针的函数

syntax - 当我想引用一个枚举的变体时,是否有办法停止重复该枚举的名称? [复制]

rust - 使用 serde 时如何将向量 'flatten' 生成多个 XML 元素?

rust - 如何将对象数组传递给 WebAssembly 并使用 wasm-bindgen 将其转换为结构向量?

c# - 获取要序列化的扩展 LINQ 类属性

ios - swift 3 json序列化

rust - 可中止 : Dangling Futures?

使用rust 柴油机 : the trait bound `NaiveDateTime: Deserialize<' _>` is not satisfied

java - 覆盖系统类的serialVersionUID

java - 使 "class"成为 transient 或可序列化但该类是可序列化的