Как сериализовать или десериализовать универсальную структуру с помощью пакета сообщений? - PullRequest
0 голосов
/ 23 октября 2019

Я использую rmp_serde для сериализации и десериализации некоторых структур. Одна структура содержит универсальный тип, и компилятор говорит:

error: the trait bound `T: api::_IMPL_SERIALIZE_FOR_User::_serde::Serialize` is not satisfied
label: the trait `api::_IMPL_SERIALIZE_FOR_User::_serde::Serialize` is not implemented for `T`

Для NodeJs пакет сообщений работает без проблем, но я работаю с ржавчиной в течение нескольких дней ...

extern crate rmp_serde as rmps;
use bytes::Bytes;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, PartialEq, Debug)]
pub struct User {
    pub name: String,
    pub token: String,
    pub hash: String,
}

#[derive(Deserialize, Serialize, PartialEq, Debug)]
pub struct Message<T> {
    pub utc: u64,
    pub mtd: u64,
    pub user: User,
    pub payload: T,
}

pub fn serializeResponseMessage<T>(obj: &Message<T>) -> Vec<u8> {
    let serialized = rmps::encode::to_vec_named(&obj).unwrap();
    serialized
}

pub fn deserializeUserLoginRequest<T>(msg: &Bytes) -> Message<T> {
    // let mut obj = Message {
    //     utc: 0,
    //     mtd: 0,
    //     user: User {
    //         name: "".to_string(),
    //         token: "".to_string(),
    //         hash: "".to_string(),
    //     },
    //     payload: User {
    //         name: "".to_string(),
    //         token: "".to_string(),
    //         hash: "".to_string(),
    //     },
    // };

    let obj: Message<T> = rmps::decode::from_read_ref(&msg).unwrap();

    obj
}

Как я могу это реализовать?

1 Ответ

2 голосов
/ 23 октября 2019

Вам нужно убедить rustc, что T действительно сериализуемы и десериализуемы:

pub fn serializeResponseMessage<T>(obj: &Message<T>) -> Vec<u8>
where
    T: Serialize,
{
    rmps::encode::to_vec_named(obj).unwrap()
}

pub fn deserializeUserLoginRequest<'de, T>(msg: &'de Bytes) -> Message<T>
where
    T: Deserialize<'de>,
{
    rmps::decode::from_read_ref(msg).unwrap()
}
...