Признак Serialize не реализован, несмотря на то, что он реализован?

Я использую actix-web для создания приложения для восстановления пакетов, а затем вставляю их в базу данных MongoDB. У меня есть структура

 #[derive(Serialize, Deserialize, Debug)]
    pub struct Gyro{
        /// GYRO FRONT + MIDDLE
        pub x0x800: [i32; 12],
        //A1X, A1Y, A1Z, A2X, A2Y, A2Z, G1X, G1Y, G1Z, G2X, G2Y, G2Z

        /// GYRO BACK
        pub x0x402: [i32; 4],
        //Motion_GPS_CAN, Vehicle_GPS_CAN, X_Angle_GPS, Y_Angle_GPS

        ///GYRO BACK
        pub x0x403: [i32; 4],
        //Z_Angle_GPS, X_Acceleration, Y_Acceleration, Z_Acceleration
    }

И у меня не было проблем при десериализации пакетов в структуру, но когда я пытаюсь сериализовать их в BSON для вставки в mongoDB, я получаю эту ошибку

if let Ok(bson::Bson::Document(doc)) = bson::to_bson(&packet) {
                                                   ^^^^^^^ the trait `Serialize` is not implemented for `Json<Gyro>

Несмотря на то, что я правильно реализовал Serialize в структуре, а также

use serde::{Serialize, Deserialize};

в обрешетке просто не работает. Я даже проверил свои зависимости с помощью crate tree -d, и все они использовали одну и ту же версию serde. Вот мой cargo.toml

[dependencies]
actix-web = "3.1.0"
env_logger = "0.7"
serde = { version = "1.0.117", features = ["derive"] }
mongodb = "1.1.1"
bson = "1.1.0"

Есть ли скрытая проблема, которую я не могу заметить, или есть еще одна проблема в зависимостях?


person Patrox27    schedule 23.10.2020    source источник


Ответы (1)


Проблема в том, что вы пытаетесь сериализовать значение типа Json<Gyro>, а не Gyro. Если предположить, что это тип actix-web Json, это не не реализую Serialize. Вам нужно будет либо развернуть его, используя &packet.into_inner() (который потребляет значение), либо сославшись на внутреннее значение с помощью &*packet или &packet.0.

person apetranzilla    schedule 23.10.2020
comment
Я думаю, что &packet.0 является более общим, поскольку он не будет потреблять packet без надобности. - person Sven Marnach; 23.10.2020
comment
Это тоже сработает, все сводится к стилистическим предпочтениям. Я думаю, что into_inner будет немного более ясным и явным, если предположить, что значение позже не понадобится. Поскольку тип также реализует Deref, также должна быть возможность использовать &*packet как другой способ избежать потребления значения. - person apetranzilla; 23.10.2020
comment
Мне нравится &*packet даже больше. Я не согласен, что это стилистическая разница, и мне не нравится употреблять packet, если вам нужна только ссылка на внутреннее значение. - person Sven Marnach; 23.10.2020
comment
Честно говоря, я отредактировал свой ответ, включив в него &*packet и &packet.0. - person apetranzilla; 23.10.2020