首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化未实现序列化的外部机箱枚举的vec

序列化未实现序列化的外部机箱枚举的vec
EN

Stack Overflow用户
提问于 2020-07-05 00:18:47
回答 2查看 524关注 0票数 4

我使用外部crate与枚举,它没有实现序列化,我想在struct中使用它,它将包含此枚举的Vec of,并有可能对此结构进行反/序列化。基于我创建的serde documentation,下面的代码

代码语言:javascript
复制
use serde::{Serialize, Deserialize};

#[derive(Debug, PartialEq, Eq)]
enum ExternalCrateColor {
    Red,
    Green,
    Blue
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(remote = "ExternalCrateColor")]
enum LocalColor {
    Red,
    Green,
    Blue
}

#[derive(Debug, Serialize, Deserialize)]
struct Hue {
    #[serde(with = "LocalColor")]
    color: ExternalCrateColor
}

fn main() {
    let tones = Hue { color: ExternalCrateColor::Blue };
    let serialized = serde_json::to_string(&tones).unwrap();
    println!("serialized = {}", serialized);
    let deserialized: Hue = serde_json::from_str(&serialized).unwrap();
    if deserialized.color == ExternalCrateColor::Blue {
      println!("Blue tones");
    }
}

Rust playground

但我想要的是让色调结构包含ExternalCrateColor的Vec:

代码语言:javascript
复制
struct Hue {
    #[serde(with = "LocalColor")]
    colors: Vec<ExternalCrateColor>
}

而且它不起作用,因为在这种情况下,反/序列化需要单个ExternalCrateColor。如何让它工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-05 04:17:31

我不认为您可以使用serde的远程类型特性来实现这一点,但是您可以通过首先定义一个转换来实现:

代码语言:javascript
复制
fn to_local(color: &ExternalCrateColor) -> LocalColor {
    match color {
        ExternalCrateColor::Red => LocalColor::Red,
        ExternalCrateColor::Green => LocalColor::Green,
        ExternalCrateColor::Blue => LocalColor::Blue,
    }
}
fn to_external(color: &LocalColor) -> ExternalCrateColor {
    match color {
        LocalColor::Red => ExternalCrateColor::Red,
        LocalColor::Green => ExternalCrateColor::Green,
        LocalColor::Blue => ExternalCrateColor::Blue,
    }
}

使用这些转换,您可以像这样实现它:

代码语言:javascript
复制
fn color_vec_ser<S: Serializer>(
    vec: &Vec<ExternalCrateColor>,
    serializer: S
) -> Result<S::Ok, S::Error> {
    // First convert the vector into a Vec<LocalColor>.
    let vec2: Vec<LocalColor> = vec.iter().map(to_local).collect();

    // Instead of serializing Vec<ExternalCrateColor>, we serialize Vec<LocalColor>.
    vec2.serialize(serializer)
}
fn color_vec_deser<'de, D: Deserializer<'de>>(
    deserializer: D
) -> Result<Vec<ExternalCrateColor>, D::Error> {
    // Deserialize as if it was a Vec<LocalColor>.
    let vec: Vec<LocalColor> = Deserialize::deserialize(deserializer)?;

    // Convert it into an Vec<ExternalCrateColor>
    Ok(vec.iter().map(to_external).collect())
}

#[derive(Debug, Serialize, Deserialize)]
struct Hue {
    #[serde(serialize_with = "color_vec_ser")]
    #[serde(deserialize_with = "color_vec_deser")]
    colors: Vec<ExternalCrateColor>
}
票数 4
EN

Stack Overflow用户

发布于 2020-07-05 04:17:20

我将需要检查serde的代码库,但我能够使它与黑客的工作。

代码语言:javascript
复制
use serde::{Serialize, Deserialize};

#[derive(Debug, PartialEq, Eq,)]
enum ExternalCrateColor {
    Red,
    Green,
    Blue
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(remote = "ExternalCrateColor")]
enum LocalColor {
    Red,
    Green,
    Blue
}

#[derive(Debug, Serialize, Deserialize)]
struct Adapter {
    #[serde(with = "LocalColor")]
    color: ExternalCrateColor
}

#[derive(Debug, Serialize, Deserialize)]
struct Hue {
    colors: Vec<Adapter>
}

fn main() {
        let adapters = vec![Adapter {  color: ExternalCrateColor::Blue }, Adapter {color: ExternalCrateColor::Green}];
        let hue = Hue {colors: adapters};
//     let tones = Hue { color: ExternalCrateColor::Blue };
//     let serialized = serde_json::to_string(&tones).unwrap();
//     println!("serialized = {}", serialized);
//     let deserialized: Hue = serde_json::from_str(&serialized).unwrap();
//     if deserialized.color == ExternalCrateColor::Blue {
//       println!("Blue tones");
//     }
}

Rust Playground

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62731538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档