serde skip 属性实际上是否跳过枚举变体?
Does serde skip attribute actually skip an enum variant?
我有一个这样的枚举:
#[derive(Debug, Deserialize, Serialize)]
enum E {
A(i32),
#[serde(skip)]
B(bool),
C(char),
D(Vec<i32>),
}
然后我尝试使用 bincode crate 执行以下操作:
fn main() {
let data = E::C('A');
let encoded = bincode::serialize(&data).unwrap();
let decoded = bincode::deserialize::<E>(&encoded).unwrap();
println!("{:?}", decoded);
}
然而,这会引发以下消息:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Io(Custom { kind: UnexpectedEof, error: "failed to fill whole buffer" })', src/main.rs:16:19
我注意到,如果出现以下情况之一,一切正常:
- 我删除了
#[serde(skip)]
属性
- 我从变体中删除元组
我还了解到 bincode 以某种方式忽略了 #[serde(skip)]
并尝试将 encoded
反序列化为 E::D(Vec<i32>)
。如果我将 Vec<i32>
更改为 char
它会起作用,但是 decoded
将是 E::D('A')
(而不是 E::C('A')
)。
我是不是遗漏了什么或者是 bincode crate 中的错误?
目前看来,使用 serde
跳过字段在 bincode
等非自描述格式上效果不佳。关于这个有几个未解决的问题:
skip_serializing_if
is a footgun 在 serde
的 GitHub 存储库上。
skip_deserializing
variant attribute has confusing behavior 在 bincode
的 GitHub 存储库上。
我有一个这样的枚举:
#[derive(Debug, Deserialize, Serialize)]
enum E {
A(i32),
#[serde(skip)]
B(bool),
C(char),
D(Vec<i32>),
}
然后我尝试使用 bincode crate 执行以下操作:
fn main() {
let data = E::C('A');
let encoded = bincode::serialize(&data).unwrap();
let decoded = bincode::deserialize::<E>(&encoded).unwrap();
println!("{:?}", decoded);
}
然而,这会引发以下消息:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Io(Custom { kind: UnexpectedEof, error: "failed to fill whole buffer" })', src/main.rs:16:19
我注意到,如果出现以下情况之一,一切正常:
- 我删除了
#[serde(skip)]
属性 - 我从变体中删除元组
我还了解到 bincode 以某种方式忽略了 #[serde(skip)]
并尝试将 encoded
反序列化为 E::D(Vec<i32>)
。如果我将 Vec<i32>
更改为 char
它会起作用,但是 decoded
将是 E::D('A')
(而不是 E::C('A')
)。
我是不是遗漏了什么或者是 bincode crate 中的错误?
目前看来,使用 serde
跳过字段在 bincode
等非自描述格式上效果不佳。关于这个有几个未解决的问题:
skip_serializing_if
is a footgun 在serde
的 GitHub 存储库上。skip_deserializing
variant attribute has confusing behavior 在bincode
的 GitHub 存储库上。