如何在 Any 和 Send Traits 上实现 Sized、Serialize/Deserialize 函数?
How do I implement Sized, Serialize/Deserialize functions on Any and Send Traits?
在具有复杂数据类型(如 Arc
指针 Mutex
锁)的结构上实现 serializing/deserializing 和调整功能时遇到问题。首先,我使用这个主题解决了这些 Arc
和 Mutex
serialization/deserialization 问题:
但是现在,我陷入了实现 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);
}
中的代码
它给出了以下错误:
error[E0277]: the size for values of type `(dyn std::any::Any + std::marker::Send + 'static)` cannot be known at compilation time
--> src/main.rs:15:5
|
15 | pub data: Arc<Mutex<Any + Send>>,
| ^^^ doesn't have a size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)`
= note: to learn more, visit <https://doc.rust-lang.org/book/second-edition/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>`
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Arc<std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>>`
= note: required by `serde::ser::SerializeStruct::serialize_field`
error[E0277]: the trait bound `(dyn std::any::Any + std::marker::Send + 'static): serde::Serialize` is not satisfied
--> src/main.rs:15:5
|
15 | pub data: Arc<Mutex<Any + Send>>,
| ^^^ the trait `serde::Serialize` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)`
|
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>`
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Arc<std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>>`
= note: required by `serde::ser::SerializeStruct::serialize_field`
error[E0277]: the trait bound `(dyn std::any::Any + std::marker::Send + 'static): serde::Deserialize<'_>` is not satisfied
--> src/main.rs:15:5
|
15 | pub data: Arc<Mutex<Any + Send>>,
| ^^^ the trait `serde::Deserialize<'_>` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)`
您可以使用此解决方案作为变通方法,但我想它应该适合您。
您必须分别访问 data: Arc<Mutex<Any + Send>>
然后 serialize/deserialze 数据和 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);
}
这里是操场。
Playground
在具有复杂数据类型(如 Arc
指针 Mutex
锁)的结构上实现 serializing/deserializing 和调整功能时遇到问题。首先,我使用这个主题解决了这些 Arc
和 Mutex
serialization/deserialization 问题:
但是现在,我陷入了实现 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);
}
中的代码
它给出了以下错误:
error[E0277]: the size for values of type `(dyn std::any::Any + std::marker::Send + 'static)` cannot be known at compilation time
--> src/main.rs:15:5
|
15 | pub data: Arc<Mutex<Any + Send>>,
| ^^^ doesn't have a size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)`
= note: to learn more, visit <https://doc.rust-lang.org/book/second-edition/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>`
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Arc<std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>>`
= note: required by `serde::ser::SerializeStruct::serialize_field`
error[E0277]: the trait bound `(dyn std::any::Any + std::marker::Send + 'static): serde::Serialize` is not satisfied
--> src/main.rs:15:5
|
15 | pub data: Arc<Mutex<Any + Send>>,
| ^^^ the trait `serde::Serialize` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)`
|
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>`
= note: required because of the requirements on the impl of `serde::Serialize` for `std::sync::Arc<std::sync::Mutex<(dyn std::any::Any + std::marker::Send + 'static)>>`
= note: required by `serde::ser::SerializeStruct::serialize_field`
error[E0277]: the trait bound `(dyn std::any::Any + std::marker::Send + 'static): serde::Deserialize<'_>` is not satisfied
--> src/main.rs:15:5
|
15 | pub data: Arc<Mutex<Any + Send>>,
| ^^^ the trait `serde::Deserialize<'_>` is not implemented for `(dyn std::any::Any + std::marker::Send + 'static)`
您可以使用此解决方案作为变通方法,但我想它应该适合您。
您必须分别访问 data: Arc<Mutex<Any + Send>>
然后 serialize/deserialze 数据和 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);
}
这里是操场。 Playground