Что такое эквивалент Rust объекта JavaScript
То есть HashMap
:
use rmp_serde::{Deserializer, Serializer, encode::StructMapWriter};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize)]
pub struct Test {
a: u32,
b: u32,
}
fn main() {
let mut buf = Vec::new();
let mut val = HashMap::new();
val.insert("a", 3);
val.insert("b", 5);
val.serialize(&mut Serializer::new(&mut buf)).unwrap();
println!("{:x?}", buf);
let test: Test = Deserialize::deserialize(&mut Deserializer::new(&buf[..])).unwrap();
println!("{:?}", test);
buf.clear();
test.serialize(&mut Serializer::with(&mut buf, StructMapWriter))
.unwrap();
println!("{:x?}", buf);
}
Это дает ожидаемый результат:
[82, a1, 61, 3, a1, 62, 5]
Test { a: 3, b: 5 }
[82, a1, 61, 3, a1, 62, 5]
Как видите, вы можете десериализоваться в нечто иное, чем HashMap
, но сериализация не произведет того же, потому что вы "потеряли" информацию о том, что это был HashMap
. по умолчанию в rmp - использовать компактную сериализацию («Это конструктор по умолчанию, который возвращает сериализатор, который будет сериализовать структуры, используя компактное представление кортежа, без имен полей.»), Но вы можете указать rmp:сериализуйте его по-другому, если вам нужно с StructMapWriter
.