Serialisasi adalah proses mengubah objek atau struktur data menjadi format sekuensial yang cocok untuk dikirim melalui jaringan atau disimpan dalam file. Proses sebaliknya, deserialisasi, mengembalikan data ke keadaan semula. Menurut MDN Web Docs, serialisasi diperlukan untuk setiap komunikasi antarproses. Serialisasi mendasari REST API, caching, dan pertukaran data antar komponen aplikasi.
Poin Utama
Serialisasi adalah proses mengubah objek yang berada di memori operasional menjadi urutan byte atau karakter linier yang dapat dikirim melalui jaringan, disimpan dalam file, atau diteruskan ke proses lain. Tanpa serialisasi, komunikasi jaringan, penyimpanan status, dan komunikasi antarproses tidak mungkin dilakukan.
Serialisasi mencakup dua proses yang berlawanan. Proses langsung (serialisasi) mengemas data ke dalam format untuk transmisi. Proses sebaliknya (deserialisasi) mengembalikan data kembali ke objek. Deserialisasi sangat penting untuk keamanan: data input yang tidak benar dapat menyebabkan kerentanan dalam aplikasi.
Dalam pengembangan aplikasi seluler, serialisasi digunakan di mana-mana: mengirim permintaan ke server dan memproses respons, menyimpan status aplikasi saat rotasi layar, caching data di disk, dan mentransmisikan data antar layar melalui Intent (Android) atau Segue (iOS).
Format serialisasi dibagi menjadi format teks dan biner. Format teks (JSON, XML) dapat dibaca manusia dan tidak memerlukan alat untuk dilihat. Format biner (Protobuf, FlatBuffers, MessagePack) lebih kompak dan lebih cepat, tetapi tidak dapat dibaca tanpa deserialisasi. Pemilihan format adalah kompromi antara kinerja dan kemudahan debugging.
Selain JSON, XML, dan Protobuf, ada format khusus: FlatBuffers dari Google untuk game dan AR, MessagePack — alternatif biner kompak JSON, Avro dari Apache untuk big data di Kafka, YAML — format konfigurasi dengan dukungan komentar.
| Format | Tipe | Skema | Ukuran | Kecepatan |
|---|---|---|---|---|
| JSON | Teks | Opsional | Sedang | Sedang |
| XML | Teks | XSD | Besar | Rendah |
| Protobuf | Biner | Wajib | Kecil | Tinggi |
| FlatBuffers | Biner | Wajib | Kecil | Maksimal |
| MessagePack | Biner | Tidak | Kecil | Tinggi |
| Avro | Biner | JSON Schema | Kecil | Tinggi |
Serialisasi di platform seluler memiliki kekhasan tersendiri: lalu lintas terbatas, prosesor yang lebih lemah, dan kebutuhan untuk menyimpan status saat rotasi layar. Di Android, digunakan Gson, Moshi, Kotlinx Serialization. Di iOS — Codable, JSONSerialization, PropertyListEncoder. Pemilihan pustaka yang tepat sangat memengaruhi kinerja aplikasi.
Kotlinx Serialization — pustaka modern dari JetBrains untuk Kotlin Multiplatform Mobile. Mendukung JSON, Protobuf, CBOR, dan format khusus. Pembuatan kode terjadi pada tahap kompilasi melalui plugin Kotlin Serialization, yang memastikan kinerja tinggi tanpa menggunakan refleksi.
Pustaka Kotlinx Serialization menggunakan anotasi @Serializable untuk kelas dan plugin kompiler untuk menghasilkan serializer. Ini memastikan kinerja tinggi dan keamanan tipe. Format default adalah JSON, tetapi format lain juga didukung melalui modul tambahan.
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
@Serializable
data class Project(
val id: Int,
val name: String,
val platforms: List<String>,
val active: Boolean
)
val json = Json {
prettyPrint = true
ignoreUnknownKeys = true
encodeDefaults = true
}
fun main() {
val project = Project(1, "MobileApp",
listOf("Android", "iOS"), true)
// Serialisasi
val jsonString = json.encodeToString(project)
// Deserialisasi
val restored = json.decodeFromString<Project>(jsonString)
}
Protokol Codable — mekanisme serialisasi bawaan di Swift. Ini menggabungkan protokol Encodable (serialisasi) dan Decodable (deserialisasi). JSONEncoder dan JSONDecoder secara otomatis memproses struktur bersarang, array, nilai opsional, dan kunci khusus melalui CodingKeys.
import Foundation
struct AppConfig: Codable {
let appName: String
let version: String
let features: [String]
let isProduction: Bool
}
let config = AppConfig(
appName: "MyApp",
version: "2.1.0",
features: ["push", "analytics", "offline"],
isProduction: true
)
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
guard let data = try? encoder.encode(config) else { return }
let jsonString = String(data: data, encoding: .utf8)
Kinerja format serialisasi dievaluasi berdasarkan tiga metrik: ukuran pesan, kecepatan serialisasi, dan kecepatan deserialisasi. Untuk aplikasi seluler, ketiganya penting: ukuran memengaruhi lalu lintas dan waktu pemuatan, kecepatan — responsivitas antarmuka dan waktu startup aplikasi.
Protobuf dan FlatBuffers menunjukkan hasil terbaik berkat representasi biner. FlatBuffers dibedakan oleh fakta bahwa ia tidak memerlukan langkah deserialisasi terpisah — data dibaca langsung dari buffer biner, yang ideal untuk game dan aplikasi AR dengan kebutuhan latensi minimal. JSON tetap menjadi format paling populer untuk REST API, meskipun kinerjanya lebih rendah, berkat kesederhanaan dan universalitasnya.
| Skenario | Format yang direkomendasikan | Alasan |
|---|---|---|
| REST API | JSON | Universalitas, keterbacaan, dukungan |
| Mikroservis | Protobuf | Kekompakan, kecepatan, gRPC |
| Game / AR | FlatBuffers | Zero-copy, latensi minimal |
| Big Data | Avro | Kompatibilitas dengan Kafka dan Hadoop |
| Konfigurasi | YAML | Komentar, keterbacaan |
| Android layouts | XML | Standar platform |
Pengujian praktis pada kumpulan 1000 objek pengguna menunjukkan: Protobuf membuat pesan berukuran 12 KB (JSON — 85 KB, XML — 120 KB). Waktu serialisasi: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Angka-angka ini menjadikan format biner lebih disukai untuk sistem beban tinggi dan aplikasi seluler dengan lalu lintas terbatas.
Contoh menunjukkan serialisasi objek yang sama dalam format yang berbeda. Ini membantu membandingkan ukuran dan keterbacaan secara visual. Objek User yang sama akan diserialisasi dalam JSON, XML, dan Protobuf — terlihat jelas bahwa JSON lebih kompak daripada XML, dan Protobuf adalah yang paling kompak dan sekaligus tidak dapat dibaca.
JSON — sintaks minimal, kunci dalam tanda kutip, nilai dari berbagai tipe. Menempati 80 karakter. Keterbacaan tinggi, struktur visual jelas. Cocok untuk API di mana kecepatan pengembangan dan debugging penting.
XML — setiap elemen dibungkus dalam tag pembuka dan penutup. Menempati 150 karakter. Keterbacaan sedang, struktur ketat. Cocok untuk aliran dokumen dan sistem yang memerlukan validasi melalui XSD.
Protobuf — biner, 32 byte untuk data ini. Tidak terbaca — memerlukan deserialisasi untuk dilihat. Ukuran minimal membuatnya ideal untuk sistem beban tinggi dan aplikasi seluler.
{
"id": 42,
"name": "IT Sectr",
"email": "team@itsectr.com",
"role": "admin",
"active": true
}
<user>
<id>42</id>
<name>IT Sectr</name>
<email>team@itsectr.com</email>
<role>admin</role>
<active>true</active>
</user>
Praktik terbaik membantu menghindari kesalahan umum dan memilih strategi serialisasi yang tepat untuk proyek. Mengikuti rekomendasi ini meningkatkan kinerja, keamanan, dan pemeliharaan kode.
Keamanan serialisasi — aspek yang sangat penting, terutama saat mendeserialisasi data dari sumber yang tidak terpercaya. Serangan deserialisasi dapat menyebabkan eksekusi kode jarak jauh (RCE), salah satu kerentanan paling berbahaya dalam aplikasi web dan seluler. Kasus paling terkenal terkait dengan Java Serializable dan Python pickle.
Protobuf dan JSON memiliki perlindungan bawaan terhadap serangan semacam itu, karena mereka hanya bekerja dengan data, bukan dengan objek arbitrer. Java Serializable, sebaliknya, dapat memulihkan kelas apa pun yang tersedia di classpath, yang membuatnya berbahaya untuk menerima data dari sumber eksternal. Di Android, disarankan untuk menggunakan Kotlinx Serialization atau Moshi daripada Java Serialization standar.
Tindakan keamanan tambahan: tetapkan batasan ukuran data input, validasi skema sebelum deserialisasi, jangan percaya Content-Type dari header HTTP, gunakan daftar putih (allowlist) untuk kelas yang diizinkan. Perbarui pustaka serialisasi secara teratur, karena kerentanan di dalamnya secara periodik ditemukan dan diperbaiki.
Pertanyaan yang Sering Diajukan
Serialisasi mengubah objek menjadi urutan byte, marshalling mentransmisikan data antara ruang alamat yang berbeda dengan mempertahankan tipe dan struktur. Marshalling mencakup serialisasi sebagai bagian dari proses, tetapi juga dapat mencakup pengkodean referensi dan manajemen memori.
FlatBuffers dari Google memberikan kecepatan maksimal berkat deserialisasi zero-copy — data dibaca langsung dari buffer biner tanpa transformasi. Protobuf menempati posisi kedua, JSON ketiga. XML adalah format paling lambat dari yang umum.
Kotlinx Serialization — pilihan terbaik untuk proyek baru di Kotlin: pembuatan kompilator, dukungan Kotlin Multiplatform, null safety. Moshi — pilihan bagus untuk proyek Java, lebih berkinerja dari Gson. Gson — pustaka paling sederhana untuk memulai, tetapi lebih lambat dan menggunakan refleksi.
Referensi siklik menyebabkan rekursi tak terbatas saat serialisasi. Solusi: gunakan referensi ID alih-alih referensi langsung ke objek, terapkan adaptor serialisasi khusus (misalnya, @JsonIgnore di Jackson), atau desain ulang model data untuk menghilangkan siklus.
Ya, terutama deserialisasi data dari sumber yang tidak tepercaya. Kerentanan deserialisasi dapat menyebabkan eksekusi kode jarak jauh. Rekomendasi: jangan deserialisasi data dari sumber yang tidak tepercaya, gunakan daftar putih kelas saat deserialisasi, dan validasi skema data sebelum diproses.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga