gpt4 book ai didi

rust - 使用 msgpack 编码时,JavaScript 对象的 Rust 等价物是什么?

转载 作者:行者123 更新时间:2023-11-29 08:10:45 31 4
gpt4 key购买 nike

我正在尝试移植 JavaScript library它使用 msgpack 将 JavaScript 对象编码为 Rust。我找到了一个用于 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 输入?

最佳答案

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 以外的东西,但序列化不会产生相同的东西,因为您“丢失”了它是 HashMap 的信息>。 default rmp 的是使用紧凑序列化(“这是默认构造函数,它返回一个序列化器,它将使用紧凑的元组表示序列化结构,没有字段名称。”),但是如果需要,您可以告诉 rmp 以不同的方式序列化它StructMapWriter.

关于rust - 使用 msgpack 编码时,JavaScript 对象的 Rust 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55375588/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com