我正在尝试为包含结构变体的枚举实现 Serialize
。 serde.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
这在 Vec
和 HashMap
中也很有效。
关于serialization - 为什么在使用带有结构变体的枚举手动实现的序列化序列化为 TOML 时出现 UnsupportedType 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560593/