Как реализовать функции Sized, Serialize / Deserialize для Any и Send Traits? - PullRequest
0 голосов
/ 15 ноября 2018

У меня возникла проблема при реализации функций сериализации / десериализации и определения размера в структуре, которая имеет сложные типы данных, такие как Arc указатели Mutex блокировки.Сначала я решил проблему Arc и Mutex сериализации / десериализации, используя эту тему:

Как мне сериализовать или десериализовать Arc в Serde?

но теперь я застрял на реализации 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)`

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете использовать это решение как обходной путь, но я думаю, оно должно сработать для вас.

Вам необходимо получить доступ к data: Arc<Mutex<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)]
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);

}

Вот детская площадка. Детская площадка

...