การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม
มาโคร derive
การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
Serde คืออะไร
Serde (SERialize/DEserialize) คือเฟรมเวิร์กของ Rust สำหรับแปลงโครงสร้างข้อมูลไปเป็นและกลับจากรูปแบบต่าง ๆ เช่น JSON, YAML และรูปแบบอื่น ๆ
- แกนกลางไม่ขึ้นกับรูปแบบ พร้อม crate สำหรับแต่ละรูปแบบ
- ขับเคลื่อนด้วยมาโคร derive
การเพิ่ม serde
เพิ่ม serde พร้อมฟีเจอร์ derive และ crate สำหรับรูปแบบข้อมูล เช่น serde_json ขั้นตอนนี้จะแก้ไข Cargo.toml
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"การสร้างเทรตโดยอัตโนมัติ
ใส่แอตทริบิวต์ให้ struct ด้วย #[derive(Serialize, Deserialize)] เพื่อให้สามารถแปลงรูปแบบได้ แต่ละฟิลด์ต้องสามารถทำซีเรียลไลซ์ได้ด้วยตนเอง
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct User {
id: u32,
name: String,
}Serialize หมายถึงการแปลงเป็นรูปแบบหนึ่ง
Serialize แปลงค่าให้เป็นไบต์หรือข้อความในรูปแบบใดรูปแบบหนึ่ง struct จะไม่ทราบว่าจะใช้รูปแบบใด แต่ crate ของรูปแบบนั้นจะเป็นผู้กำหนด
Deserialize หมายถึงการแปลงกลับจากรูปแบบหนึ่ง
Deserialize แยกวิเคราะห์ข้อความหรือไบต์กลับมาเป็นค่า Rust พร้อมตรวจสอบชนิดข้อมูลและฟิลด์ที่จำเป็นไปพร้อมกัน
จำลองการทำซีเรียลไลซ์ด้วยตนเอง
เพื่อสร้างความเข้าใจ นี่คือตัวซีเรียลไลซ์ที่เขียนขึ้นเองสำหรับ struct แบบง่าย serde จะสร้างโค้ดลักษณะนี้ให้คุณโดยอัตโนมัติ
struct User { id: u32, name: String }
fn serialize(u: &User) -> String {
format!("id={};name={}", u.id, u.name)
}
fn main() {
let u = User { id: 7, name: "Alice".to_string() };
println!("{}", serialize(&u));
}จำลองการทำดีซีเรียลไลซ์ด้วยตนเอง
และนี่คือกระบวนการย้อนกลับ: แยกวิเคราะห์ข้อความกลับมาเป็น struct โค้ดที่ serde สร้างขึ้นจะทำงานนี้ได้อย่างมีประสิทธิภาพกับหลายรูปแบบ
struct User { id: u32, name: String }
fn deserialize(s: &str) -> User {
let parts: Vec<&str> = s.split(',').collect();
let id = parts[0].parse().unwrap();
let name = parts[1].to_string();
User { id, name }
}
fn main() {
let u = deserialize("42,Bob");
println!("{} {}", u.id, u.name);
}การ derive บน enum
enum ก็ใช้งานได้เช่นกัน โดยค่าเริ่มต้น แต่ละ variant จะถูกทำซีเรียลไลซ์ด้วยชื่อของตนเอง และข้อมูลใด ๆ จะถูกซ้อนอยู่ภายใน
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
enum Shape {
Circle { radius: f64 },
Square { side: f64 },
}โครงสร้างซ้อนกัน
serde จะทำงานแบบเรียกซ้ำโดยอัตโนมัติ struct ที่มี struct อื่นซึ่ง derive ไว้แล้ว หรือมี Vec ก็ใช้งานได้ทันที
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Address { city: String }
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
addresses: Vec<Address>,
}ทำซีเรียลไลซ์อย่างเดียวหรือดีซีเรียลไลซ์อย่างเดียว
คุณสามารถ derive เพียง trait เดียวได้ เช่น ชนิดข้อมูลผลลัพธ์จาก API อาจใช้ Serialize เท่านั้น ส่วนชนิดข้อมูลคำขอขาเข้าอาจใช้ Deserialize เท่านั้น
use serde::Serialize;
#[derive(Serialize)]
struct ApiResponse {
status: u16,
message: String,
}ข้อกำหนดของ derive
ชนิดของทุกฟิลด์ต้อง implement trait ที่คุณ derive ชนิดข้อมูลมาตรฐานและคอลเลกชันต่าง ๆ ทำไว้แล้ว แต่ชนิดข้อมูลแบบกำหนดเองต้อง derive ของตนเอง
use serde::Serialize;
#[derive(Serialize)]
struct Inner { x: i32 }
#[derive(Serialize)]
struct Outer { inner: Inner }ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการทำซีเรียลไลซ์และดีซีเรียลไลซ์
สรุป
คุณได้เรียนรู้พื้นฐานของ serde:
- serde เป็นเฟรมเวิร์กสำหรับการทำซีเรียลไลซ์และดีซีเรียลไลซ์ที่ไม่ผูกกับรูปแบบใด
#[derive(Serialize, Deserialize)]จะสร้างโค้ดสำหรับการแปลงให้- ใช้งานได้กับ struct, enum และชนิดข้อมูลที่ซ้อนกัน
- เมื่อเหมาะสม คุณสามารถ derive เพียงทิศทางเดียวได้
ถัดไป: การทำงานกับ JSON ผ่าน serde_json
คำถามที่พบบ่อย
บทเรียน “การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม”
มาโคร derive คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม
- การทำงานกับ JSON
- การทำให้เป็นอนุกรมแบบกำหนดเอง
- รูปแบบอื่น