使用 msgpack 编码时,JavaScript 对象的 Rust 等价物是什么?
What is the Rust equivalent of a JavaScript object when encoding with msgpack?
我正在尝试将 JavaScript library 移植到 Rust,它使用 msgpack 将 JavaScript 对象编码。我找到了一个用于 msgpack encoding/decoding 的 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 输入?
What is the Rust equivalent of a JavaScript object
那是一个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
以外的其他内容,但序列化不会产生相同的内容,因为您 "lost" 的信息是 HashMap
。 rmp 的 default 是使用紧凑序列化 ("This is the default constructor, which returns a serializer that will serialize structs using compact tuple representation, without field names."),但是如果需要 StructMapWriter
.
,您可以告诉 rmp 以不同的方式序列化它
我正在尝试将 JavaScript library 移植到 Rust,它使用 msgpack 将 JavaScript 对象编码。我找到了一个用于 msgpack encoding/decoding 的 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 输入?
What is the Rust equivalent of a JavaScript object
那是一个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
以外的其他内容,但序列化不会产生相同的内容,因为您 "lost" 的信息是 HashMap
。 rmp 的 default 是使用紧凑序列化 ("This is the default constructor, which returns a serializer that will serialize structs using compact tuple representation, without field names."),但是如果需要 StructMapWriter
.