【问题标题】:Serde's Serialize implementation not found for Rocket's UUID没有为 Rocket 的 UUID 找到 Serde 的序列化实现
【发布时间】:2019-03-30 05:40:44
【问题描述】:

我正在尝试使用 Rocket 中的 UUID 结构作为字段类型来创建自定义结构。我希望使用 Serde 对其进行序列化,以便轻松将其转换为 JSON。

尝试执行此操作时,出现错误:

error[E0277]: the trait bound `rocket_contrib::UUID: 
model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::Serialize` is not 
satisfied
 --> src/service/document.rs:4:10
  |
4 | #[derive(Serialize, Deserialize)]
  |          ^^^^^^^^^ the trait 
`model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::Serialize` is not 
implemented for `rocket_contrib::UUID`
  |
  = note: required by `model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::ser::SerializeStruct::serialize_field`

error[E0277]: the trait bound `rocket_contrib::UUID: 
model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::Deserialize<'_>` is not satisfied
 --> src/service/document.rs:4:21
  |
4 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^ the trait 
`model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::Deserialize<'_>` is not implemented for `rocket_contrib::UUID`
  |
  = note: required by `model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::de::SeqAccess::next_element`

error[E0277]: the trait bound `rocket_contrib::UUID: model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::Deserialize<'_>` is not satisfied
 --> src/service/document.rs:4:21
  |
4 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^ the trait `model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::Deserialize<'_>` is not implemented for `rocket_contrib::UUID`
  |
  = note: required by `model::event::_IMPL_DESERIALIZE_FOR_Event::_serde::de::MapAccess::next_value`

我的结构:

#[derive(Serialize, Deserialize)]
pub struct Document {
    id: UUID,
    user_id: UUID,
    created: i64,
    updated: i64,
    text: String
}

我的进口:

[dependencies]
rocket = "0.3.17"
rocket_codegen = "0.3.17"

serde_derive = "1.0.80"
serde = "1.0.80"

chrono = "0.4"

[dependencies.rocket_contrib]
version = "0.3.17"
default-features = false
features = ["json", "uuid", "serde"]

我使用结构的端点:

#[get("/document/<id>")]
pub fn get_document(id: UUID) -> status::Accepted<Json<Document>> {
    status::Accepted(Some(Json(document::get_document(id))))
}

我检查了所有依赖项,并在rocket_contrib 中启用了serde 功能。我已经想不出接下来要检查的内容了。

【问题讨论】:

    标签: rust serde rust-rocket


    【解决方案1】:

    rocket_contrib::UUIDnot implement Serialize:

    #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
    pub struct UUID(uuid_ext::Uuid);
    

    如果该类型没有实现Serialize,则无法实现。

    作为mcarton points out:

    您仍然可以为您的类型实现 Serialize,您根本无法导出它,必须手动实现它。

    这可能看起来像:

    #[derive(Serialize, Deserialize)]
    pub struct Document {
        #[serde(with = "my_uuid")]
        id: UUID,
        #[serde(with = "my_uuid")]
        user_id: UUID,
        created: i64,
        updated: i64,
        text: String,
    }
    
    mod my_uuid {
        use rocket_contrib::UUID;
        use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
        use std::str::FromStr;
    
        pub fn serialize<S>(val: &UUID, serializer: S) -> Result<S::Ok, S::Error>
        where
            S: Serializer,
        {
            val.to_string().serialize(serializer)
        }
    
        pub fn deserialize<'de, D>(deserializer: D) -> Result<UUID, D::Error>
        where
            D: Deserializer<'de>,
        {
            let val: &str = Deserialize::deserialize(deserializer)?;
            UUID::from_str(val).map_err(D::Error::custom)
        }
    }
    

    另见:

    【讨论】:

    • @Mestru 请注意,您仍然可以为您的类型实现 Serialize,您根本无法导出它并且必须实现它手工。
    猜你喜欢
    • 2021-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2019-03-10
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多