序列化
大约 1 分钟
序列化
Sea-ORM 的 Model/ActiveModel 可派生 Serialize/Deserialize
,配合 serde
控制对外 JSON 表现。
启用 chrono 序列化
# Cargo.toml
sea-orm = { version = "0.12", features = ["with-chrono"] }
chrono = { version = "0.4", features = ["serde"] }
基本序列化
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, serde::Serialize, serde::Deserialize)]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub username: String,
#[serde(skip_serializing)]
pub password_hash: String,
pub created_at: chrono::DateTime<chrono::Utc>,
}
- 使用
#[serde(skip_serializing)]
隐藏敏感字段 - 使用
#[serde(rename = "xxx")]
改名 - 使用
#[serde(default)]
填默认
自定义时间序列化(毫秒时间戳)
mod ts_ms {
use serde::{Serializer, Deserializer, Serialize, Deserialize};
pub fn serialize<S>(dt: &chrono::DateTime<chrono::Utc>, s: S) -> Result<S::Ok, S::Error>
where S: Serializer {
s.serialize_i64(dt.timestamp_millis())
}
pub fn deserialize<'de, D>(d: D) -> Result<chrono::DateTime<chrono::Utc>, D::Error>
where D: Deserializer<'de> {
let ms = i64::deserialize(d)?;
Ok(chrono::NaiveDateTime::from_timestamp_millis(ms).ok_or_else(|| serde::de::Error::custom("bad ts"))?.and_utc())
}
}
#[derive(serde::Serialize, serde::Deserialize)]
struct Item {
#[serde(with = "ts_ms")]
created_at: chrono::DateTime<chrono::Utc>,
}
JSON/枚举字段
- JSON 列:使用
serde_json::Value
或强类型结构体(#[derive(Serialize, Deserialize)]
) - 枚举:使用 ActiveEnum(见“类型转换”),可控制数据库存储为 string/int,同时可序列化为 JSON
只读/写入专用结构
- Model 用于数据库映射
- 对外 API 使用 VO/Resource(只序列化),对内写入使用 DTO(只反序列化)
- 避免直接用 Model 作为外部输入类型
大小写风格
- 统一 JSON 风格:蛇形/小驼峰
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct UserVO { real_name: String }