Что такое эквивалент Rust объекта JavaScript при кодировании с помощью msgpack? - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь портировать библиотеку JavaScript , которая использует msgpack для кодирования объектов JavaScript в Rust. Я нашел библиотеку Rust для кодирования / декодирования msgpack, но я не понимаю, каков эквивалентный формат ввода в Rust.

Этот код JavaScript для кодирования объекта {"a": 5, "b": 6} дает вывод 82 a1 61 03 a1 62 05:

const msgpack = require("msgpack-lite");
msgpack.encode(obj);

Я попытался представить объект в виде структуры Rust и кодировать его, используя rmp-serde library

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]. Как мне представить входные данные JSON в Rust?

1 Ответ

6 голосов
/ 27 марта 2019

Что такое эквивалент 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...