【问题标题】:What is the Rust equivalent of a JavaScript object when encoding with msgpack?使用 msgpack 编码时,JavaScript 对象的 Rust 等价物是什么?
【发布时间】:2019-03-27 10:59:58
【问题描述】:

我正在尝试移植一个 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 输入?

【问题讨论】:

  • 数据序列化和反序列化通常最好使用Serde,它有一个Messagepack的实现。

标签: rust msgpack


【解决方案1】:

什么是 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

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 2023-01-17
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多