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

我注意到,如果出现以下情况之一,一切正常:

  1. 我删除了#[serde(skip)]属性
  2. 我从变体中删除元组

我还了解到 bincode 以某种方式忽略了 #[serde(skip)] 并尝试将 encoded 反序列化为 E::D(Vec<i32>)。如果我将 Vec<i32> 更改为 char 它会起作用,但是 decoded 将是 E::D('A')(而不是 E::C('A'))。

我是不是遗漏了什么或者是 bincode crate 中的错误?

目前看来,使用 serde 跳过字段在 bincode 等非自描述格式上效果不佳。关于这个有几个未解决的问题: