【问题标题】:The trait Serialize is not implemented despite being implemented?尽管已实施,但特征序列化未实施?
【发布时间】:2021-02-06 20:43:27
【问题描述】:

我正在使用 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"

是否存在我似乎没有注意到的隐藏问题,或者依赖项中是否存在其他问题?

【问题讨论】:

    标签: rust serde actix-web


    【解决方案1】:

    问题在于您正在尝试序列化类型为Json&lt;Gyro&gt; 的值,而不是Gyro。假设这是 actix-web Json 类型,它没有实现 Serialize。您需要使用 &amp;packet.into_inner() (消耗值)或使用 &amp;*packet&amp;packet.0 引用内部值来解开它。

    【讨论】:

    • 我认为&amp;packet.0 更通用,因为它不会不必要地消耗packet
    • 这也行,它只是归结为风格偏好。我认为into_inner 会更加清晰和明确,假设以后不需要该值。由于该类型还实现了Deref,因此也应该可以使用&amp;*packet 作为另一种避免消耗值的方式。
    • 我更喜欢&amp;*packet。我不同意这是一种风格上的差异,如果您只需要对内部值的引用,我不喜欢使用 packet
    • 公平地说,我已经编辑了我的答案以包括 &amp;*packet&amp;packet.0
    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多