Skip to content

Commit 4e81c38

Browse files
committed
Fix(serde): properly serialize unit structs.
Previously it was serialized as unit (nil), now there is just empty array ([]).
1 parent 46d0093 commit 4e81c38

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

rmp-serde/src/encode.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,12 @@ impl<'a, W: VariantWriter> serde::Serializer for Serializer<'a, W> {
305305
value.serialize(self)
306306
}
307307

308+
fn visit_unit_struct(&mut self, _name: &'static str) -> Result<(), Error> {
309+
try!(write_array_len(&mut self.wr, 0));
310+
311+
Ok(())
312+
}
313+
308314
fn visit_struct<V>(&mut self, _name: &str, mut visitor: V) -> Result<(), Error>
309315
where V: serde::ser::MapVisitor,
310316
{

rmp-serde/tests/se_macro.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ fn pass_struct() {
2424
assert_eq!([0x92, 0x2a, 0xce, 0x0, 0x1, 0x88, 0x94], buf);
2525
}
2626

27+
#[test]
28+
fn pass_empty_struct() {
29+
// Must be encoded as [].
30+
let mut buf = vec![];
31+
32+
#[derive(Serialize)]
33+
struct Struct;
34+
35+
let val = Struct;
36+
val.serialize(&mut Serializer::new(&mut buf)).ok().unwrap();
37+
38+
assert_eq!(vec![0x90], buf);
39+
}
40+
2741
#[test]
2842
fn pass_struct_map() {
2943
use std::io::Write;

0 commit comments

Comments
 (0)