Rust 在没有[derive(Serialize)]的情况下,是否可以在枚举上实现/派生序列化?

Rust 在没有[derive(Serialize)]的情况下,是否可以在枚举上实现/派生序列化?,rust,serde,rust-diesel,rust-rocket,Rust,Serde,Rust Diesel,Rust Rocket,我正在使用rust+rocket+diesel-orm+serde_-derive来制作一个restapi。目前,如果diesel由于任何原因未能插入用户,我将处理api的错误处理。看起来是这样的: #[derive(Serialize, Deserialize)] #[serde(remote = "diesel::result::Error")] struct ErrorDef { // Definition in here the same as the enum diesel::

我正在使用rust+rocket+diesel-orm+serde_-derive来制作一个restapi。目前,如果diesel由于任何原因未能插入用户,我将处理api的错误处理。看起来是这样的:

#[derive(Serialize, Deserialize)]
#[serde(remote = "diesel::result::Error")]
struct ErrorDef {
    // Definition in here the same as the enum diesel::result::Error
    // ...
}
struct JsonErrorRespone {
    pub success: bool,
    #[serde(with = "ErrorDef")]
    pub error: diesel::result::Error,
}
pub fn createuser:InsertableUser,连接:&MysqlConnection->ApiResponse{ 让result=diesel::insert_intousers::table .values&InsertableUser::散列用户 .执行连接; 比赛结果{ Ok=>ApiResponse{ json:json!{success:true,error:null}, 状态:状态::好, }, Errerror=>{ println!无法创建配方:{:?},错误; 蜂群反应{ json:json!{success:false,error:error}, 状态:状态::无法处理的实体, } } } } 然而,json:json!{success:false,error:error},给我这个错误:

特性绑定'diesel::result::Error:user::\U IMPL\U DESERDE::Serialize'不满足 未为`diesel::result::Error`实现特性`user::_IMPL\u反序列化`(针对` user::_serde::Serialize`)` 注意:之所以需要,是因为对impl的要求是“用户:”:“用户:”:“serde::Serialize”“FOR`&“柴油机::结果::错误”` 注:serde_json::value::to_value`rustcE0277需要 123,27:未为'diesel::result::Error'实现特性'user::'的\u IMPL\u反序列化\'u::\u serde::Serialize'` 听起来,diesel::result::Error没有[deriveSerialize],因此不能用json序列化!宏。因此,我需要某种方法使diesel::result::Error实现/派生序列化

提前感谢您的帮助

顺便说一句,API的响应如下所示:

使用rocket::http:{ContentType,Status}; 使用rocket::request::request; 使用火箭:响应; 使用rocket::response::{Responder,response}; 使用rocket_contrib::json::JsonValue; [衍生博客] 发布结构ApiResponse{ pub-json:JsonValue, 发布状态:状态, } API响应的impl{
fn response_toself,req:&Request->response::ResultSerde提供了一种解决方案,用于派生外部板条箱的序列化实现-请参阅其文档中的部分

您必须使用与本例中尝试序列化的diesel::result::Error相同的定义定义定义枚举,然后将其标识为尝试序列化的类型的代理,如下所示:

#[derive(Serialize, Deserialize)]
#[serde(remote = "diesel::result::Error")]
struct ErrorDef {
    // Definition in here the same as the enum diesel::result::Error
    // ...
}
struct JsonErrorRespone {
    pub success: bool,
    #[serde(with = "ErrorDef")]
    pub error: diesel::result::Error,
}
当然,对于错误类型中包含的所有类型,或者至少对于尚未实现序列化的任何类型,都必须执行相同的操作

文档中指出,Serde会对照“远程”板条箱中的定义检查您提供的定义,如果它们不同,则会抛出一个错误,这将有助于保持它们的同步

还请注意,这不会导致diesel::result::Error实现Serialize-而是您现在有了一个替代类型,可以这样使用:

#[derive(Serialize, Deserialize)]
#[serde(remote = "diesel::result::Error")]
struct ErrorDef {
    // Definition in here the same as the enum diesel::result::Error
    // ...
}
struct JsonErrorRespone {
    pub success: bool,
    #[serde(with = "ErrorDef")]
    pub error: diesel::result::Error,
}
然后将序列化上述结构的实例,而不是现有的json!宏调用

或者,上面链接的文档还提供了一些手动调用正确的序列化/反序列化实现的技巧


免责声明:我尚未使用此功能,以上内容仅从文档中收集。

Serde提供了一个解决方案,用于派生外部板条箱的序列化实现-请参阅其文档中的部分

您必须使用与本例中尝试序列化的diesel::result::Error相同的定义定义定义枚举,然后将其标识为尝试序列化的类型的代理,如下所示:

#[derive(Serialize, Deserialize)]
#[serde(remote = "diesel::result::Error")]
struct ErrorDef {
    // Definition in here the same as the enum diesel::result::Error
    // ...
}
struct JsonErrorRespone {
    pub success: bool,
    #[serde(with = "ErrorDef")]
    pub error: diesel::result::Error,
}
当然,对于错误类型中包含的所有类型,或者至少对于尚未实现序列化的任何类型,都必须执行相同的操作

文档中指出,Serde会对照“远程”板条箱中的定义检查您提供的定义,如果它们不同,则会抛出一个错误,这将有助于保持它们的同步

还请注意,这不会导致diesel::result::Error实现Serialize-而是您现在有了一个替代类型,可以这样使用:

#[derive(Serialize, Deserialize)]
#[serde(remote = "diesel::result::Error")]
struct ErrorDef {
    // Definition in here the same as the enum diesel::result::Error
    // ...
}
struct JsonErrorRespone {
    pub success: bool,
    #[serde(with = "ErrorDef")]
    pub error: diesel::result::Error,
}
然后将序列化上述结构的实例,而不是现有的json!宏调用

或者,上面链接的文档还提供了一些手动调用正确的序列化/反序列化实现的技巧

免责声明:我还没有使用过此功能,以上内容仅从文档中收集。

简短回答:。就我个人而言,我一直觉得有点困难

作为一种折衷办法,您可以只提取与您相关的错误部分,甚至执行以下操作:

ApiResponse {
    json: json!({"success": false, "error": error.to_string() }),
    status: Status::UnprocessableEntity,
}
如果您只对错误的文本表示感到满意。

简短的回答:。就个人而言,我总是觉得这有点困难

作为一种折衷办法,你可以只抽出其中的一部分 与您相关的错误,甚至可以执行以下操作:

ApiResponse {
    json: json!({"success": false, "error": error.to_string() }),
    status: Status::UnprocessableEntity,
}

如果您只满足于错误的文本表示。

或者,您可以为其实现自定义错误类型和。从那以后,你完全可以自由地做任何事情。由于柴油机的错误类型包含在板条箱中,除非修改板条箱本身,否则无法向其添加serialize。或者,您可以为其实现自定义错误类型和From。从那以后,你完全可以自由地做任何事情。由于diesel的错误类型包含在板条箱中,除非修改板条箱本身,否则无法向其添加serialize。这是我所问问题的正确答案,因此我已将其标记为正确-尽管在我的代码中,我必须以某种方式获得diesel的。执行以返回代理结构。如果我错了,请更正我。因此@Alistair的答案就是我在代码中最终使用的答案这是我所问问题的正确答案,因此我已将其标记为正确-尽管在代码中,我必须以某种方式获得diesel的。execute返回代理结构。如果我错了,请更正我。所以@Alistair的答案就是我在代码中使用的