serde 跳过属性实际上跳过枚举变体吗?

Cou*_*ero 3 rust serde bincode

我有一个像这样的枚举:

#[derive(Debug, Deserialize, Serialize)]
enum E {
    A(i32),

    #[serde(skip)]
    B(bool),

    C(char),
    D(Vec<i32>),
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用bincode crate执行以下操作:

fn main() {
    let data = E::C('A');
    let encoded = bincode::serialize(&data).unwrap();
    let decoded = bincode::deserialize::<E>(&encoded).unwrap();
    println!("{:?}", decoded);
}
Run Code Online (Sandbox Code Playgroud)

然而,这会引发以下消息:

#[derive(Debug, Deserialize, Serialize)]
enum E {
    A(i32),

    #[serde(skip)]
    B(bool),

    C(char),
    D(Vec<i32>),
}
Run Code Online (Sandbox Code Playgroud)

我注意到,如果满足以下条件之一,则一切正常:

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

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

我错过了什么还是 bincode 箱中的错误?

mca*_*ton 5

目前看来,使用 跳过字段serde对于非自描述格式(如bincode. 关于此有几个未解决的问题: