在具有复杂数据类型(如Arc指针Mutex锁)的结构上实现序列化/反序列化和大小调整功能时遇到问题。首先,我使用本主题解决了这些Arc和Mutex序列化/反序列化问题:
但是现在,我被困在实现ser/desr和调整Any和Send特征的大小上,我既没有想法也没有编译示例来解决这个问题。
代码在这里:
#[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)
您可以使用此解决方案作为解决方法,但我想它应该可以为您解决。
您必须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)
这里是游乐场。 操场
| 归档时间: |
|
| 查看次数: |
1018 次 |
| 最近记录: |