use rmp_serde::Serializer;
use serde::Serialize;
#[ test]
fn pass_unit_struct() {
#[ derive(Serialize)]
struct Unit;
let mut buf = Vec::new();
Unit.serialize(&mut Serializer::new(&mut buf)).unwrap();
// Expect: [].
assert_eq!(vec![0 x90], buf);
}
#[ test]
fn pass_unit_variant() {
#[ derive(Serialize)]
enum Enum {
V1,
V2,
}
let mut buf = Vec::new();
Enum ::V1.serialize(&mut Serializer::new(&mut buf)).unwrap();
Enum ::V2.serialize(&mut Serializer::new(&mut buf)).unwrap();
// Expect: "V1", "V2"
assert_eq!(vec![0 xa2, 0 x56, 0 x31, 0 xa2, 0 x56, 0 x32], buf);
}
#[ test]
fn pass_newtype_struct() {
#[ derive(Serialize)]
struct Struct (u64);
let val = Struct (42 );
let mut buf = Vec::new();
val.serialize(&mut Serializer::new(&mut buf)).unwrap();
assert_eq!(vec![0 x2a], buf);
}
#[ test]
fn pass_newtype_variant() {
#[ derive(Serialize)]
enum Enum {
V2(u64),
}
let mut buf = Vec::new();
Enum ::V2(42 ).serialize(&mut Serializer::new(&mut buf)).unwrap();
// Expect: {"V2" => 42}
assert_eq!(buf, vec![0 x81, 0 xa2, 0 x56, 0 x32, 42 ]);
}
#[ test]
fn pass_untagged_newtype_variant() {
#[ derive(Serialize)]
#[ serde(untagged)]
enum Enum1 {
A(u64),
B(Enum2),
}
#[ derive(Serialize)]
enum Enum2 {
C,
}
let buf1 = rmp_serde::to_vec(&Enum1::A(123 )).unwrap();
let buf2 = rmp_serde::to_vec(&Enum1::B(Enum2::C)).unwrap();
assert_eq!(buf1, [123 ]);
// Expect: "C"
assert_eq!(buf2, [0 xa1, 0 x43]);
}
#[ test]
fn pass_tuple_struct() {
#[ derive(Serialize)]
struct Struct (u32, u64);
let val = Struct (42 , 100500 );
let mut buf = Vec::new();
val.serialize(&mut Serializer::new(&mut buf)).unwrap();
// Expect: [42, 100500].
assert_eq!(vec![0 x92, 0 x2a, 0 xce, 0 x00, 0 x01, 0 x88, 0 x94], buf);
}
#[ test]
fn pass_tuple_variant() {
#[ derive(Serialize)]
enum Enum {
V1,
V2(u32, u64),
}
let mut buf = Vec::new();
Enum ::V1.serialize(&mut Serializer::new(&mut buf)).unwrap();
Enum ::V2(42 , 100500 ).serialize(&mut Serializer::new(&le='color:red'>mut buf)).unwrap();
// Expect: {0 => nil} {1 => [42, 100500]}
// Expect: "V1", {"V2" => [42, 100500] }
assert_eq!(
vec![0 xa2, 0 x56, 0 x31, 0 x81, 0 xa2, 0 x56, 0 x32, 0 x92, 0 x2a, 0 xce, 0 x0, 0 x1, 0 x88, 0 x94],
buf
);
}
#[ test]
fn pass_struct() {
#[ derive(Serialize)]
struct Struct {
f1: u32,
f2: u32,
}
let val = Struct {
f1: 42 ,
f2: 100500 ,
};
let mut buf = Vec::new();
val.serialize(&mut Serializer::new(&mut buf)).unwrap();
// Expect: [42, 100500].
assert_eq!(vec![0 x92, 0 x2a, 0 xce, 0 x0, 0 x1, 0 x88, 0 x94], buf);
}
#[ test]
fn serialize_struct_variant() {
#[ derive(Serialize)]
enum Enum {
V1 { f1: u32 },
V2 { f1: u32 },
}
let mut buf = Vec::new();
Enum ::V1 { f1: 42 }.serialize(&mut Serializer::new(&mut buf)).unwrap();
Enum ::V2 { f1: 43 }.serialize(&mut Serializer::new(&mut buf)).unwrap();
// Expect: { "V1" => [42] } { "V2" => [43] }
assert_eq!(
vec![0 x81, 0 xa2, 0 x56, 0 x31, 0 x91, 0 x2a, 0 x81, 0 xa2, 0 x56, 0 x32, 0 x91, 0 x2b],
buf
);
}
#[ test]
fn serialize_struct_variant_as_map() {
#[ derive(Serialize)]
enum Enum {
V1 { f1: u32 },
}
let mut se = Serializer::new(Vec::new()).with_struct_map();
Enum ::V1 { f1: 42 }.serialize(&mut se).unwrap();
// Expect: {"V1" => {"f1": 42}}.
assert_eq!(
vec![0 x81, 0 xa2, 0 x56, 0 x31, 0 x81, 0 xa2, 0 x66, 0 x31, 0 x2a],
se.into_inner()
);
}
#[ test]
fn serialize_struct_with_flattened_map_field() {
use std::collections::BTreeMap;
#[ derive(Serialize)]
struct Struct {
f1: u32,
// not flattend!
f2: BTreeMap<String, String>,
#[ serde(flatten)]
f3: BTreeMap<String, String>,
}
let mut se = Serializer::new(Vec::new());
Struct {
f1: 0 ,
f2: {
let mut map = BTreeMap::new();
map.insert("german" .to_string(), "Hallo Welt!" .to_string());
map
},
f3: {
let mut map = BTreeMap::new();
map.insert("english" .to_string(), "Hello World!" .to_string());
map
},
}
.serialize(&mut se).unwrap();
// Expect: { "f1": 0, "f2": { "german": "Hallo Welt!" }, "english": "Hello World!" }.
assert_eq!(
vec![
0 x83, 0 xA2, 0 x66, 0 x31, 0 x00, 0 xA2, 0 x66, 0 x32, 0 x81, 0 xA6, 0 x67, 0 x65, 0 x72, 0 x6D, 0 x61, 0 x6E, 0 xAB,
0 x48, 0 x61, 0 x6C, 0 x6C, 0 x6F, 0 x20, 0 x57, 0 x65, 0 x6C, 0 x74, 0 x21, 0 xA7, 0 x65, 0 x6E, 0 x67, 0 x6C, 0 x69,
0 x73, 0 x68, 0 xAC, 0 x48, 0 x65, 0 x6C, 0 x6C, 0 x6F, 0 x20, 0 x57, 0 x6F, 0 x72, 0 x6C, 0 x64, 0 x21,
],
se.into_inner()
);
}
#[ test]
fn serialize_struct_with_flattened_struct_field() {
#[ derive(Serialize)]
struct Struct {
f1: u32,
// not flattend!
f2: InnerStruct,
#[ serde(flatten)]
f3: InnerStruct,
}
#[ derive(Serialize)]
struct InnerStruct {
f4: u32,
f5: u32,
}
let strct = Struct {
f1: 0 ,
f2: InnerStruct { f4: 8 , f5: 13 },
f3: InnerStruct { f4: 21 , f5: 34 },
};
// struct-as-tuple
{
let mut se = Serializer::new(Vec::new());
strct.serialize(&mut se).unwrap();
// Expect: { "f1": 0, "f2": [8, 13], "f4": 21, "f5": 34 }.
assert_eq!(vec![
0 x84, 0 xA2, 0 x66, 0 x31, 0 x00, 0 xA2, 0 x66, 0 x32, 0 x92, 0 x08, 0 x0D, 0 xA2, 0 x66, 0 x34, 0 x15, 0 xA2, 0 x66, 0 x35, 0 x22,
],
se.into_inner());
}
// struct-as-map
{
let mut se = Serializer::new(Vec::new()).with_struct_map();
strct.serialize(&mut se).unwrap();
// Expect: { "f1": 0, "f2": { "f4": 8, "f5": 13 }, "f4": 21, "f5": 34 }.
assert_eq!(
vec![
0 x84, 0 xA2, 0 x66, 0 x31, 0 x00, 0 xA2, 0 x66, 0 x32, 0 x82, 0 xA2, 0 x66, 0 x34, 0 x08,
0 xA2, 0 x66, 0 x35, 0 x0D, 0 xA2, 0 x66, 0 x34, 0 x15, 0 xA2, 0 x66, 0 x35, 0 x22,
],
se.into_inner()
);
}
}
#[ test]
fn pass_struct_as_map_using_ext() {
#[ derive(Serialize)]
struct Dog<'a> {
name: &'a str,
age: u16,
}
let dog = Dog {
name: "Bobby" ,
age: 8 ,
};
let mut se = Serializer::new(Vec::new()).with_struct_map();
dog.serialize(&mut se).unwrap();
// Expect: {"name": "Bobby", "age": 8}.
assert_eq!(vec![0 x82, 0 xa4, 0 x6e, 0 x61, 0 x6d, 0 x65, 0 xa5, 0 x42, 0 x6f, 0 x62, 0 x62, 0 x79, 0 xa3, 0 x61, 0 x67, 0 x65, 0 x08],
se.into_inner());
}
#[ test]
fn pass_struct_as_tuple_using_double_ext() {
#[ derive(Serialize)]
struct Dog<'a> {
name: &'a str,
age: u16,
}
let dog = Dog {
name: "Bobby" ,
age: 8 ,
};
let mut se = Serializer::new(Vec::new())
.with_struct_map()
.with_struct_tuple();
dog.serialize(&mut se).unwrap();
assert_eq!(vec![0 x92, 0 xa5, 0 x42, 0 x6f, 0 x62, 0 x62, 0 x79, 0 x08],
se.into_inner());
}
#[ test]
fn pass_struct_as_map_using_triple_ext() {
#[ derive(Serialize)]
struct Dog<'a> {
name: &'a str,
age: u16,
}
let dog = Dog {
name: "Bobby" ,
age: 8 ,
};
let mut se = Serializer::new(Vec::new())
.with_struct_map()
.with_struct_tuple()
.with_struct_map();
dog.serialize(&mut se).unwrap();
// Expect: {"name": "Bobby", "age": 8}.
assert_eq!(vec![0 x82, 0 xa4, 0 x6e, 0 x61, 0 x6d, 0 x65, 0 xa5, 0 x42, 0 x6f, 0 x62, 0 x62, 0 x79, 0 xa3, 0 x61, 0 x67, 0 x65, 0 x08],
se.into_inner());
}
#[ test]
fn pass_struct_as_map_using_triple_ext_many_times() {
#[ derive(Serialize)]
struct Dog<'a> {
name: &'a str,
age: u16,
}
let dog = Dog {
name: "Bobby" ,
age: 8 ,
};
let mut se = Serializer::new(Vec::new())
.with_struct_map()
.with_struct_tuple()
.with_struct_map()
.with_struct_map()
.with_struct_map()
.with_struct_map();
dog.serialize(&mut se).unwrap();
// Expect: {"name": "Bobby", "age": 8}.
assert_eq!(vec![0 x82, 0 xa4, 0 x6e, 0 x61, 0 x6d, 0 x65, 0 xa5, 0 x42, 0 x6f, 0 x62, 0 x62, 0 x79, 0 xa3, 0 x61, 0 x67, 0 x65, 0 x08],
se.into_inner());
}
Messung V0.5 in Prozent C=76 H=99 G=88
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-23)
¤
*© Formatika GbR, Deutschland