3Hren / 3Hren/msgpack-rust

Enum encoding discrepancy between `rmp-serde` and `rmpv` serde implementations

Open
#327 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
1.4k
Forks
162
PR merge metrics
No merged PRs in 30d

Description

The `serde` implementation in `rmp-serde` encodes enum variants as a single-element mapping with the variant's name as a key; in contrast, `rmpv`'s serde implementation encodes enum variants as a two-element array with the variant _index_ as the first element.

Example:

```rust
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
pub enum Foo {
Bar(String),
}

fn main() {
let bar = Foo::Bar(String::from("Heya lol"));
let encoded_bin = rmp_serde::encode::to_vec(&bar).unwrap();
for b in &encoded_bin {
print!("{b:02x}");
}
println!();

let decoded_val = rmpv::decode::read_value::<&[u8]>(&mut encoded_bin.as_ref()).unwrap();
println!("{decoded_val:?}");

let encoded_val = rmpv::ext::to_value(&bar).unwrap();
println!("{encoded_val:?}");
}
```

The above code outputs the following:

```
81a3426172a848657961206c6f6c
Map([(String(Utf8String { s: Ok("Bar") }), String(Utf8String { s: Ok("Heya lol") }))])
Array([Integer(PosInt(0)), Array([String(Utf8String { s: Ok("Heya lol") })])])
```

Either of these encodings is reasonable on its own, but it would seem that the two implementations should agree by default.

Relatedly, as noted in #323, the documentation incorrectly states that the default configuration in `rmp-serde` serializes enum variants as integer indices.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.