You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中实现多类型的序列化与反序列化?

Rust 多类型序列化/反序列化实现方案

要处理运行时不确定类型的序列化/反序列化,核心是用**枚举(enum)**统一包裹所有需要处理的结构体,借助serde对枚举的支持自动识别类型。

步骤1:定义包含所有目标类型的枚举

创建一个枚举,把Car、Person及后续新增类型作为枚举变体,同时给枚举添加Serialize、Deserialize宏:

use serde::{Serialize, Deserialize};

// 统一包裹所有需要序列化/反序列化的类型
#[derive(Serialize, Deserialize, Debug)]
// 可选:自定义JSON中的类型标识字段,默认会用变体名作为外层键
#[serde(tag = "type")]
enum Data {
    Car(Car),
    Person(Person),
    // 后续新增类型直接追加到这里即可
}

// 原有结构体保持不变
#[derive(Serialize, Deserialize, Debug)]
struct Car {
    model: i32,
    year: i32,
}

#[derive(Serialize, Deserialize, Debug)]
struct Person {
    name: String,
    age: i32,
}

步骤2:修改序列化函数

让序列化函数接受&Data类型参数,即可处理所有被枚举包裹的结构体:

fn serialize(object: &Data) -> String {
    // 实际项目中建议返回Result处理错误,不要直接unwrap
    serde_json::to_string(object).unwrap()
}

调用示例

fn main() {
    let my_car = Car { model: 123, year: 2024 };
    let car_json = serialize(&Data::Car(my_car));
    println!("序列化后的Car: {}", car_json);

    let my_person = Person { name: "Alice".to_string(), age: 30 };
    let person_json = serialize(&Data::Person(my_person));
    println!("序列化后的Person: {}", person_json);
}

步骤3:修改反序列化函数

让反序列化函数返回Result<Data, serde_json::Error>,既能返回解析后的枚举对象,也能处理解析错误:

use std::str;

fn deserialize(data: Vec<u8>) -> Result<Data, serde_json::Error> {
    // 先处理字节转UTF-8字符串的错误
    let msg = str::from_utf8(&data)?;
    // 反序列化为Data枚举
    serde_json::from_str(msg)
}

调用示例

fn main() {
    // 用序列化后的Car JSON测试反序列化
    let car_json = r#"{"type":"Car","model":123,"year":2024}"#;
    match deserialize(car_json.as_bytes().to_vec()) {
        Ok(Data::Car(car)) => println!("反序列化得到Car: 型号={}, 年份={}", car.model, car.year),
        Ok(Data::Person(person)) => println!("反序列化得到Person: 姓名={}, 年龄={}", person.name, person.age),
        Err(e) => println!("反序列化失败: {}", e),
    }
}

补充说明

  • #[serde(tag = "type")]会在JSON中添加type字段标识具体类型(比如"type":"Car"),反序列化时serde会自动匹配对应的枚举变体。
  • 如果不需要额外类型字段,可使用#[serde(untagged)]属性,但要求所有结构体字段无重叠,否则会解析错误,不推荐在字段可能重叠的场景使用。
  • 生产环境中,序列化/反序列化函数应返回Result而非直接unwrap,避免数据格式错误导致程序崩溃。

内容的提问来源于stack exchange,提问作者mnsme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:27:29