0Pricing
Learn Rust Coding · บทเรียน

รูปแบบอื่น

TOML, YAML, bincode

รูปแบบอื่น เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

นอกเหนือจาก JSON

แกนหลักของ serde ไม่ผูกกับรูปแบบใด ดังนั้น struct เดิมที่ derive ไว้จึงใช้งานกับหลายรูปแบบได้ เพียงเปลี่ยน crate ของรูปแบบข้อมูล

  • TOML สำหรับการตั้งค่า
  • YAML สำหรับข้อมูลที่อ่านเข้าใจง่าย
  • bincode สำหรับข้อมูลไบนารีขนาดกะทัดรัด

struct เดียว หลายรูปแบบ

คุณกำหนด struct เพียงครั้งเดียว crate ของแต่ละรูปแบบจะมี to_string / from_str ที่เทียบเท่ากัน โดยทำงานกับ impl ของ Serialize / Deserialize ชุดเดียวกัน

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Config {
    name: String,
    port: u16,
}

TOML

TOML เป็นรูปแบบยอดนิยมสำหรับการตั้งค่า (ตัว Cargo.toml เองก็ใช้รูปแบบนี้) crate toml ใช้ทำซีเรียลไลซ์และแยกวิเคราะห์ข้อมูลดังกล่าว

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_toml(c: &Config) -> String {
    toml::to_string(c).unwrap()
}

แยกวิเคราะห์ TOML

อ่านการตั้งค่า TOML กลับมาเป็น struct ด้วย toml::from_str

use serde::Deserialize;

#[derive(Deserialize)]
struct Config { name: String, port: u16 }

fn parse(s: &str) -> Config {
    toml::from_str(s).unwrap()
}

YAML

YAML เหมาะกับข้อมูลที่มนุษย์แก้ไขและมีการซ้อนกัน ใช้ crate เช่น serde_yaml ซึ่งมีรูปแบบ API เดียวกัน

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_yaml(c: &Config) -> String {
    serde_yaml::to_string(c).unwrap()
}

bincode

bincode เป็นรูปแบบไบนารีขนาดกะทัดรัด เหมาะสำหรับแคชหรือการส่งข้อมูลผ่านเครือข่ายเมื่อขนาดและความเร็วสำคัญ และไม่มีมนุษย์ต้องอ่านข้อมูลนั้น

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_bytes(c: &Config) -> Vec<u8> {
    bincode::serialize(c).unwrap()
}

การเลือกรูปแบบ

เลือกตามกลุ่มผู้ใช้งาน:

  • การตั้งค่าที่มนุษย์อ่านและมีการซ้อนกัน: TOML หรือ YAML
  • เว็บ API: JSON
  • การจัดเก็บหรือส่งข้อมูลไบนารีภายใน: bincode

จำลองการเลือกรูปแบบ

การตัดสินใจก็คือการจับคู่กรณีใช้งานกับรูปแบบข้อมูล ตัวอย่างที่รันได้นี้จำลองตรรกะการเลือกดังกล่าว

fn pick_format(use_case: &str) -> &str {
    match use_case {
        "config" => "TOML",
        "api" => "JSON",
        "cache" => "bincode",
        _ => "JSON",
    }
}

fn main() {
    println!("{}", pick_format("config"));
    println!("{}", pick_format("cache"));
    println!("{}", pick_format("api"));
}

ส่งไบต์ไปกลับ

รูปแบบไบนารีสามารถส่งไปกลับได้: ทำซีเรียลไลซ์เป็นไบต์ แล้วดีซีเรียลไลซ์กลับมาเป็น struct เดิม ตัวอย่างที่รันได้นี้จำลองแนวคิดการส่งไปกลับด้วยความยาวของไบต์

fn encode(name: &str) -> Vec<u8> {
    name.as_bytes().to_vec()
}

fn decode(bytes: &[u8]) -> String {
    String::from_utf8(bytes.to_vec()).unwrap()
}

fn main() {
    let bytes = encode("Alice");
    println!("len={}", bytes.len());
    println!("back={}", decode(&bytes));
}

ลักษณะเฉพาะของแต่ละรูปแบบ

รูปแบบข้อมูลมีความสามารถต่างกัน TOML ไม่อนุญาตค่า null และต้องใช้ตารางสำหรับการซ้อนกัน YAML รองรับ anchor ส่วน bincode ไม่บอกชนิดข้อมูลในตัว ดังนั้นทั้งสองฝั่งต้องใช้ชนิดข้อมูลเดียวกัน

แอตทริบิวต์ยังคงใช้งานได้

แอตทริบิวต์ #[serde(...)] ที่คุณเรียนรู้มา ได้แก่ rename, default และ skip ยังคงทำงานได้กับทุกรูปแบบ เพราะทำงานในชั้น serde ไม่ใช่ชั้นของรูปแบบข้อมูล

use serde::Serialize;

#[derive(Serialize)]
#[serde(rename_all = "kebab-case")]
struct Config { max_connections: u32 }

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับรูปแบบข้อมูลอื่น ๆ

สรุป

คุณได้เรียนรู้เกี่ยวกับรูปแบบข้อมูลอื่น ๆ ของ serde:

  • struct เดียวที่ derive แล้วใช้ได้กับ TOML, YAML, JSON และ bincode
  • crate ของแต่ละรูปแบบมี API ลักษณะคุ้นเคยอย่าง to_string / from_str
  • เลือกตามกลุ่มผู้ใช้: การตั้งค่า, API หรือการจัดเก็บไบนารี
  • แอตทริบิวต์ของ serde ใช้ได้กับทุกรูปแบบ

บทเรียน Serde และชุดบทเรียน Rust จบลงเพียงเท่านี้

คำถามที่พบบ่อย

บทเรียน “รูปแบบอื่น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบอื่น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบอื่น”

TOML, YAML, bincode คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบอื่น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม
  2. การทำงานกับ JSON
  3. การทำให้เป็นอนุกรมแบบกำหนดเอง
  4. รูปแบบอื่น
← กลับไปที่ Learn Rust Coding