我正在尝试移植一个使用msgpack将JavaScript对象编码为Rust的JavaScript library。我找到了一个用于msgpack编码/解码的Rust库,但是我没有得到Rust中的等效输入格式。
此JavaScript代码用于编码对象{"a": 5, "b": 6}
给出输出82 a1 61 03 a1 62 05
:
const msgpack = require("msgpack-lite");
msgpack.encode(obj);
我尝试将对象表示为Rust结构,并使用rmp-serde库对其进行编码
use rmp_serde::{Deserializer, Serializer};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct Test {
a: u32,
b: u32,
}
fn main() {
let mut buf = Vec::new();
let val = Test { a: 3, b: 5 };
val.serialize(&mut Serializer::new(&mut buf)).unwrap();
println!("{:?}", buf);
}
我得到输出[146, 3, 5]
。如何在Rust中表示JSON输入?
答案 0 :(得分:6)
与JavaScript对象等效的Rust是什么
那是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的default将使用紧凑序列化(“这是默认构造函数,它返回一个序列化程序,它将使用紧凑的元组表示形式对结构进行序列化,而没有字段名。”),但是您可以告诉rmp对其进行序列化。如果需要使用StructMapWriter
,则有所不同。