ซีเรียลไลเซอร์แบบกำหนดเอง
จัดการชนิดข้อมูลพิเศษ
ซีเรียลไลเซอร์แบบกำหนดเอง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า kotlinx.serialization
- คลาสที่ทำซีเรียลไลซ์ได้
- การเข้ารหัสและถอดรหัส JSON
- ซีเรียลไลเซอร์แบบกำหนดเอง