如何在 Any 和 Send Traits 上实现 Sized、Serialize/Deserialize 函数?

Rus*_*ear 6 rust serde

在具有复杂数据类型(如Arc指针Mutex锁)的结构上实现序列化/反序列化和大小调整功能时遇到问题。首先,我使用本主题解决了这些ArcMutex序列化/反序列化问题:

如何在 Serde 中序列化或反序列化 Arc<T>?

但是现在,我被困在实现ser/desr和调整AnySend特征的大小上,我既没有想法也没有编译示例来解决这个问题。

代码在这里:

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;

use serde::Serialize;
use std::sync::Mutex;
use std::sync::Arc;
use std::any::Any;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    pub id: u64,
    pub data: Arc<Mutex<Any + Send>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Data {
    pub name: String,
}

impl Data {
    fn new(name_parameter: String) -> Data {
        let data = Data {
            name: name_parameter,
        };
        data
    }
}

fn main() {
    let msg: Message = Message { id: 23, data: (Arc::new(Mutex::new(Data::new(String::from("TesData"))))) };
    let ser_msg = serde_json::to_string(&msg).unwrap();
    let des_msg: Message = serde_json::from_str(&ser_msg).unwrap();

    println!("{:?}", msg);
    println!("{:?}", ser_msg);
    println!("{:?}", des_msg);
}
Run Code Online (Sandbox Code Playgroud)

这是Playground 中的代码

它给出了以下错误:

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;

use serde::Serialize;
use std::sync::Mutex;
use std::sync::Arc;
use std::any::Any;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    pub id: u64,
    pub data: Arc<Mutex<Any + Send>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Data {
    pub name: String,
}

impl Data {
    fn new(name_parameter: String) -> Data {
        let data = Data {
            name: name_parameter,
        };
        data
    }
}

fn main() {
    let msg: Message = Message { id: 23, data: (Arc::new(Mutex::new(Data::new(String::from("TesData"))))) };
    let ser_msg = serde_json::to_string(&msg).unwrap();
    let des_msg: Message = serde_json::from_str(&ser_msg).unwrap();

    println!("{:?}", msg);
    println!("{:?}", ser_msg);
    println!("{:?}", des_msg);
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*mir 1

您可以使用此解决方案作为解决方法,但我想它应该可以为您解决。

您必须data: Arc<Mutex<Any + Send>>分别访问然后序列化/反序列化数据和id。

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;

use serde::Serialize;
use std::sync::Mutex;
use std::sync::Arc;
use std::any::Any;

#[derive(Debug, Clone)]
pub struct Message {
    pub id: u64,
    pub data: Arc<Mutex<Any + Send>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Data {
    pub name: String,
}

impl Data {
    fn new(name_parameter: String) -> Data {
        let data = Data {
            name: name_parameter,
        };
        data
    }
}

fn main() {
    let msg: Message = Message { id: 23, data: (Arc::new(Mutex::new(Data::new(String::from("TesData"))))) };
    let _id = msg.id;
    let guard = msg.data.lock().unwrap();
    let msg_data: Option<&Data> = guard.downcast_ref::<Data>();
    let ser_msg_data = serde_json::to_string(&msg_data).unwrap();
    let des_msg_data: Data = serde_json::from_str(&ser_msg_data).unwrap();
    println!("{:?}", des_msg_data);
    let des_msg:Message = Message {id : _id, data: Arc::new(Mutex::new(des_msg_data))};
    println!("{:?}", msg);
    println!("{:?}", ser_msg_data);
    println!("{:?}", des_msg);

}
Run Code Online (Sandbox Code Playgroud)

这里是游乐场。 操场