Реализация Serdeize Serialize для UUID Rocket не найдена

Я пытаюсь создать настраиваемую структуру, используя структуру UUID из Rocket в качестве типа поля. Я хочу, чтобы он был сериализован с помощью 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))))
}

Я проверил все зависимости, и у меня включена функция serde в rocket_contrib. У меня закончились идеи, что проверить дальше.


person Mestru    schedule 25.10.2018    source источник


Ответы (1)


rocket_contrib::UUID не реализует Serialize :

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

Если тип не реализует Serialize, вы не сможете этого сделать.

Как указывает Маккартон :

вы по-прежнему можете реализовать 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)
    }
}

Смотрите также:

person Shepmaster    schedule 25.10.2018
comment
@Mestru Обратите внимание, что вы все еще можете реализовать Serialize для своего типа, вы просто не можете получить его, и вам придется реализовать его вручную. - person mcarton; 25.10.2018