Kotlin Academy · บทเรียน

ซีเรียลไลเซอร์แบบกำหนดเอง

จัดการชนิดข้อมูลพิเศษ

บทเรียน 4 จาก 413 ขั้นตอน

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

เหตุผลที่ต้องใช้ตัวซีเรียลไลเซอร์แบบกำหนดเอง

ชนิดข้อมูลบางชนิดไม่มีตัวซีเรียลไลเซอร์ในตัว เช่น java.util.Date, LocalDate, UUID หรือชนิดข้อมูลจากไลบรารีของบุคคลที่สาม

ตัวซีเรียลไลเซอร์แบบกำหนดเองจะกำหนดวิธีจับคู่ชนิดข้อมูลดังกล่าวกับรูปแบบที่ใช้ซีเรียลไลซ์และถอดกลับ

อินเทอร์เฟซ KSerializer

ตัวซีเรียลไลเซอร์แบบกำหนดเองจะใช้งาน KSerializer<T> ซึ่งมีสมาชิกสามรายการ ได้แก่ descriptor, serialize และ deserialize

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

ตัวซีเรียลไลเซอร์สำหรับ LocalDate

จับคู่ LocalDate ไปเป็นและกลับจากสตริง ISO ตัวบอกโครงสร้างจะประกาศให้ชนิดนี้เป็นสตริงพื้นฐาน

import java.time.LocalDate
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

object LocalDateSerializer : KSerializer<LocalDate> {
    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING)
    override fun serialize(encoder: Encoder, value: LocalDate) =
        encoder.encodeString(value.toString())
    override fun deserialize(decoder: Decoder): LocalDate =
        LocalDate.parse(decoder.decodeString())
}

การใช้ @Serializable(with = ...)

ใช้ตัวซีเรียลไลเซอร์กับพร็อพเพอร์ตีเฉพาะรายการด้วย @Serializable(with = ...)

import java.time.LocalDate
import kotlinx.serialization.Serializable

@Serializable
data class Event(
    val name: String,
    @Serializable(with = LocalDateSerializer::class)
    val date: LocalDate
)

@UseSerializers ระดับไฟล์

เพื่อหลีกเลี่ยงการใส่แอนโนเทชันให้ทุกพร็อพเพอร์ตี ให้ประกาศตัวซีเรียลไลเซอร์ครั้งเดียวต่อไฟล์ด้วย @file:UseSerializers

@file:UseSerializers(LocalDateSerializer::class)

import kotlinx.serialization.UseSerializers
import java.time.LocalDate
import kotlinx.serialization.Serializable

@Serializable
data class Event(val name: String, val date: LocalDate)

การซีเรียลไลซ์แบบ Contextual

ลงทะเบียนตัวซีเรียลไลเซอร์แบบรวมศูนย์ในโมดูล Json { } และทำเครื่องหมายพร็อพเพอร์ตีด้วย @Contextual ระบบจะค้นหาตัวซีเรียลไลเซอร์ขณะรันไทม์จากโมดูล

import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import java.time.LocalDate

@Serializable
data class Event(val name: String, @Contextual val date: LocalDate)

การลงทะเบียน SerializersModule

สร้างโมดูลที่ผูกชนิดข้อมูลเข้ากับตัวซีเรียลไลเซอร์ แล้วส่งโมดูลนั้นให้กับ Json

import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import java.time.LocalDate

val module = SerializersModule {
    contextual(LocalDate::class, LocalDateSerializer)
}
val json = Json { serializersModule = module }

ตัวซีเรียลไลเซอร์แบบประกอบ

สำหรับชนิดข้อมูลที่มีหลายฟิลด์ ให้ใช้ encodeStructure / decodeStructure ร่วมกับตัวบอกโครงสร้างแบบมีโครงสร้าง แทนตัวบอกโครงสร้างแบบพื้นฐาน

import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element

val descriptor = buildClassSerialDescriptor("Color") {
    element<Int>("r")
    element<Int>("g")
    element<Int>("b")
}

รูปแบบตัวแทน

อีกทางเลือกที่ง่ายกว่าคือซีเรียลไลซ์คลาสข้อมูล ตัวแทนแบบ private ซึ่งคอมไพเลอร์รองรับอยู่แล้ว จากนั้นจึงแปลงไปเป็นและกลับจากชนิดข้อมูลจริง วิธีนี้มีโค้ดประกอบน้อยกว่าการเข้ารหัสและถอดรหัสด้วยตนเอง

import kotlinx.serialization.Serializable

@Serializable
private data class ColorSurrogate(val r: Int, val g: Int, val b: Int)

การเลือกแนวทาง

เลือกแนวทางที่เรียบง่ายที่สุดและเหมาะกับงาน:

  • @Serializable(with=) — พร็อพเพอร์ตีเดียว
  • @UseSerializers — ทั้งไฟล์
  • @Contextual + module — ทั้งแอปและค้นหาขณะรันไทม์
  • Surrogate — ชนิดข้อมูลแบบประกอบที่ใช้โค้ดน้อยที่สุด

ตัวบอกโครงสร้างแบบพื้นฐานกับแบบมีโครงสร้าง

ตัวบอกโครงสร้างต้องสอดคล้องกับวิธีการเข้ารหัส:

  • ค่าเดียว (สตริง/จำนวนเต็ม) → PrimitiveSerialDescriptor
  • หลายฟิลด์ → buildClassSerialDescriptor

หากไม่ตรงกันจะทำให้เกิดข้อผิดพลาดด้านการซีเรียลไลซ์ขณะรันไทม์

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

ต้องการซีเรียลไลซ์ LocalDate รายการเดียวเป็นสตริง ISO หนึ่งสตริง ควรใช้ตัวบอกโครงสร้างใด

ทบทวน

ตัวซีเรียลไลเซอร์แบบกำหนดเองจัดการชนิดข้อมูลที่ปลั๊กอินไม่รู้จัก:

  • ใช้งาน KSerializer<T> พร้อม descriptor + serialize + deserialize
  • นำไปใช้ผ่าน @Serializable(with=), @UseSerializers หรือ @Contextual + โมดูล
  • เลือกชนิดของตัวบอกโครงสร้างให้ตรงกับการเข้ารหัส

บทเรียนเรื่องการซีเรียลไลซ์จบลงเพียงเท่านี้

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “ซีเรียลไลเซอร์แบบกำหนดเอง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ซีเรียลไลเซอร์แบบกำหนดเอง”

จัดการชนิดข้อมูลพิเศษ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ซีเรียลไลเซอร์แบบกำหนดเอง” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่า kotlinx.serialization
  2. คลาสที่ทำซีเรียลไลซ์ได้
  3. การเข้ารหัสและถอดรหัส JSON
  4. ซีเรียลไลเซอร์แบบกำหนดเอง
← กลับไปที่ Kotlin Academy