Η σειριοποίηση είναι η διαδικασία μετατροπής ενός αντικειμένου ή δομής δεδομένων σε μια σειριακή μορφή κατάλληλη για μετάδοση μέσω δικτύου ή αποθήκευση σε αρχείο. Η αντίστροφη διαδικασία, η αποσειριοποίηση, επαναφέρει τα δεδομένα στην αρχική κατάσταση. Σύμφωνα με το MDN Web Docs, η σειριοποίηση είναι απαραίτητη για κάθε επικοινωνία μεταξύ διεργασιών. Η Σειριοποίηση βρίσκεται στη βάση των REST API, της προσωρινής αποθήκευσης και της ανταλλαγής δεδομένων μεταξύ των συνιστωσών της εφαρμογής.
Βασικά σημεία
Σειριοποίηση είναι η διαδικασία μετατροπής ενός αντικειμένου που βρίσκεται στην λειτουργική μνήμη σε μια γραμμική ακολουθία bytes ή χαρακτήρων που μπορεί να μεταδοθεί μέσω δικτύου, να αποθηκευτεί σε αρχείο ή να μεταβιβαστεί σε άλλη διεργασία. Χωρίς σειριοποίηση, η επικοινωνία δικτύου, η αποθήκευση κατάστασης και η επικοινωνία μεταξύ διεργασιών δεν είναι δυνατή.
Η σειριοποίηση περιλαμβάνει δύο αντίθετες διαδικασίες. Η άμεση διαδικασία (σειριοποίηση) συσκευάζει τα δεδομένα σε μορφή για μετάδοση. Η αντίστροφη διαδικασία (αποσειριοποίηση) επαναφέρει τα δεδομένα πίσω σε αντικείμενο. Η αποσειριοποίηση είναι κρίσιμη για την ασφάλεια: εσφαλμένα εισαγόμενα δεδομένα μπορούν να οδηγήσουν σε τρωτότητες στην εφαρμογή.
Στην ανάπτυξη εφαρμογών κινητών, η σειριοποίηση χρησιμοποιείται παντού: αποστολή αιτημάτων στον εξυπηρετητή και επεξεργασία απαντήσεων, αποθήκευση κατάστασης εφαρμογής κατά την περιστροφή οθόνης, προσωρινή αποθήκευση δεδομένων στο δίσκο και μεταφορά δεδομένων μεταξύ οθονών μέσω Intent (Android) ή Segue (iOS).
Μορφές σειριοποίησης χωρίζονται σε κειμενικές και δυαδικές. Οι κειμενικές μορφές (JSON, XML) είναι αναγνώσιμες από τον άνθρωπο και δεν απαιτούν εργαλεία για προβολή. Οι δυαδικές μορφές (Protobuf, FlatBuffers, MessagePack) είναι πιο συμπαγείς και πιο γρήγορες, αλλά δεν είναι αναγνώσιμες χωρίς αποσειριοποίηση. Η επιλογή μορφής είναι ένας συμβιβασμός μεταξύ απόδοσης και ευκολίας ερευνων σφαλμάτων.
Εκτός από JSON, XML και Protobuf, υπάρχουν ειδικευμένες μορφές: FlatBuffers από τη Google για παιχνίδια και AR, MessagePack — συμπαγής δυαδική εναλλακτική του JSON, Avro από το Apache για μεγάλα δεδομένα στο Kafka, YAML — μορφή διαμόρφωσης με υποστήριξη σχολίων.
| Μορφή | Τύπος | Σχήμα | Μέγεθος | Ταχύτητα |
|---|---|---|---|---|
| JSON | Κειμενική | Προαιρετικά | Μεσαίο | Μεσαία |
| XML | Κειμενική | XSD | Μεγάλο | Χαμηλή |
| Protobuf | Δυαδική | Υποχρεωτικά | Μικρό | Υψηλή |
| FlatBuffers | Δυαδική | Υποχρεωτικά | Μικρό | Μέγιστη |
| MessagePack | Δυαδική | Όχι | Μικρό | Υψηλή |
| Avro | Δυαδική | JSON Schema | Μικρό | Υψηλή |
Σειριοποίηση σε κινητές πλατφόρμες έχει τη δική της ιδιαιτερότητα: περιορισμένη κινήσεως, ασθενέστεροι επεξεργαστές και η ανάγκη αποθήκευσης κατάστασης κατά την περιστροφή οθόνης. Στο Android χρησιμοποιούνται Gson, Moshi, Kotlinx Serialization. Στο iOS — Codable, JSONSerialization, PropertyListEncoder. Η σωστή επιλογή βιβλιοθήκης επηρεάζει κριτικά την απόδοση της εφαρμογής.
Kotlinx Serialization — μια σύγχρονη βιβλιοθήκη από τη JetBrains για Kotlin Multiplatform Mobile. Υποστηρίζει JSON, Protobuf, CBOR και προσαρμοσμένες μορφές. Η δημιουργία κώδικα γίνεται στο στάδιο μεταγλώττισης μέσω του plugin Kotlin Serialization, πράγμα που εξασφαλίζει υψηλή απόδοση χωρίς χρήση ανάκλασης.
Η βιβλιοθήκη Kotlinx Serialization χρησιμοποιεί την σημείωση @Serializable για κλάσεις και ένα plugin μεταγλωττιστή για τη δημιουργία serializers. Αυτό εξασφαλίζει υψηλή απόδοση και ασφάλεια τύπων. Η προκαθορισμένη μορφή είναι το JSON, αλλά υποστηρίζονται και άλλες μορφές μέσω πρόσθετων αρθρωμάτων.
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)
// Σειριοποίηση
val jsonString = json.encodeToString(project)
// Αποσειριοποίηση
val restored = json.decodeFromString<Project>(jsonString)
}
Το πρωτόκολλο Codable — ο ενσωματωμένος μηχανισμός σειριοποίησης στο Swift. Συνδυάζει τα πρωτόκολλα Encodable (σειριοποίηση) και Decodable (αποσειριοποίηση). Τα JSONEncoder και JSONDecoder επεξεργάζονται αυτόματα εμφωλευμένες δομές, πίνακες, προαιρετικές τιμές και προσαρμοσμένα κλειδιά μέσω 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)
Απόδοση των μορφών σειριοποίησης αξιολογείται βασισμένη σε τρεις μετρικές: μέγεθος μηνύματος, ταχύτητα σειριοποίησης και ταχύτητα αποσειριοποίησης. Για εφαρμογές κινητών, και οι τρεις είναι κρίσιμες: το μέγεθος επηρεάζει την κινήσεωη και το χρόνο φόρτωσης, η ταχύτητα — την αποκριτικότητα της διεπαφής και το χρόνο εκκίνησης της εφαρμογής.
Τα Protobuf και FlatBuffers εμφανίζουν τα καλύτερα αποτελέσματα χαρή στη δυαδική αναπαράσταση. Το FlatBuffers διαφέρει επειδή δεν απαιτεί ξεχωριστό βήμα αποσειριοποίησης — τα δεδομένα διαβάζονται απευθείας από το δυαδικό buffer, πράγμα ιδανικό για παιχνίδια και εφαρμογές AR με απαίτηση ελάχιστης καθυστέρησης. Το JSON παραμένει η πιο δημοφιλής μορφή για REST API, παρά τη χαμηλότερη απόδοση, λόγω της απλότητας και οικουμενικότητας.
| Σενάριο | Προτεινόμενη μορφή | Λόγος |
|---|---|---|
| REST API | JSON | Οικουμενικότητα, αναγνωσιμότητα, υποστήριξη |
| Μικρουπηρεσίες | Protobuf | Συμπάγεια, ταχύτητα, gRPC |
| Παιχνίδια / AR | FlatBuffers | Zero-copy, ελάχιστη καθυστέρηση |
| Big Data | Avro | Συμβατότητα με Kafka και Hadoop |
| Ρύθμιση | YAML | Σχόλια, αναγνωσιμότητα |
| Android layouts | XML | Πρότυπο πλατφόρμας |
Πρακτικές δοκιμές σε ένα σύνολο 1000 αντικειμένων χρήστη δείχνουν: Protobuf δημιουργεί μηνύματα μεγέθους 12 KB (JSON — 85 KB, XML — 120 KB). Χρόνος σειριοποίησης: Protobuf — 2 ms, JSON — 8 ms, XML — 25 ms. Αυτά τα νούμερα καθιστούν τις δυαδικές μορφές προτιμητέες για συστήματα υψηλής φόρτωσης και εφαρμογές κινητών με περιορισμένη κινήσεως.
Παραδείγματα επιδεικνύουν τη σειριοποίηση του ίδιου αντικειμένου σε διαφορετικές μορφές. Αυτό βοηθά να συγκρίνετε οπτικά το μέγεθος και την αναγνωσιμότητα. Το ίδιο αντικείμενο User θα σειριοποιηθεί σε JSON, XML και Protobuf — είναι προφανές ότι το JSON είναι πιο συμπαγές από το XML, και το Protobuf είναι το πιο συμπαγές και ταυτόχρονα αναγνώσιμο.
JSON — μινιμαλιστική σύνταξη, κλειδιά σε εισαγωγικά, τιμές διαφορετικών τύπων. Καταλαμβάνει 80 χαρακτήρες. Αναγνωσιμότητα υψηλή, οπτική δομή σαφής. Κατάλληλο για API όπου η ταχύτητα ανάπτυξης και ερευνων σφαλμάτων είναι σημαντική.
XML — κάθε στοιχείο είναι τυλιγμένο σε ετικέτα ανοίγματος και κλείσιματος. Καταλαμβάνει 150 χαρακτήρες. Αναγνωσιμότητα μέση, δομή αυστηρή. Κατάλληλο για ροή εγγράφων και συστήματα που απαιτούν επικύρωση μέσω XSD.
Protobuf — δυαδική, 32 bytes για αυτά τα δεδομένα. Δεν είναι αναγνώσιμο — απαιτεί αποσειριοποίηση για προβολή. Το ελάχιστο μέγεθος το καθιστά ιδανικό για συστήματα υψηλής φόρτωσης και εφαρμογές κινητών.
{
"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>
Βέλτιστες πρακτικές βοηθούν να αποφυγείτε τυπικά λάθη και να επιλέξετε τη σωστή στρατηγική σειριοποίησης για το έργο. Η τήρηση αυτών των συστάσεων βελτιώνει την απόδοση, την ασφάλεια και την συντηρησιμότητα του κώδικα.
Ασφάλεια σειριοποίησης — κρίσιμης σημασίας πτυχή, ιδιαίτερα κατά την αποσειριοποίηση δεδομένων από μη αξιόπιστες πηγές. Οι επιθέσεις σε αποσειριοποίηση μπορούν να οδηγήσουν σε εκ αποστάσεως εκτέλεση κώδικα (RCE), μια από τις πιο επικίνδυνες τρωτότητες σε εφαρμογές ιστού και κινητών. Οι πιο γνωστές περιπτώσεις σχετίζονται με τα Java Serializable και Python pickle.
Τα Protobuf και JSON έχουν ενσωματωμένη προστασία από τέτοιες επιθέσεις, καθώς εργάζονται μόνο με δεδομένα, όχι με αυθαίρετα αντικείμενα. Το Java Serializable, αντίθετα, μπορεί να επαναφέρει οποιαδήποτε κλάση διαθέσιμη στο classpath, καθιστώντας το επικίνδυνο για λήψη δεδομένων από εξωτερικές πηγές. Στο Android συνιστάται η χρήση Kotlinx Serialization ή Moshi αντί της τυπικής Java Serialization.
Πρόσθετα μέτρα ασφαλείας: ορίστε όριο στο μέγεθος των εισαγόμενων δεδομένων, επικυρώστε το σχήμα πριν την αποσειριοποίηση, μην εμπιστεύεστε στο Content-Type από τις κεφαλίδες HTTP, χρησιμοποιείτε λίστα επιτρεπόμενων κλάσεων (allowlist). Ενημερώνετε τακτικά τις βιβλιοθήκες σειριοποίησης, καθώς οι τρωτότητες σε αυτές ανακαλύπτονται και διορθώνονται περιοδικά.
Συχνές Ερωτήσεις
Σειριοποίηση μετατρέπει ένα αντικείμενο σε σειρά bytes, το marshalling μεταφέρει δεδομένα μεταξύ διαφορετικών χώρων διευθύνσεων διατηρώντας τους τύπους και τη δομή. Το marshalling περιλαμβάνει τη σειριοποίηση ως μέρος της διαδικασίας, αλλά μπορεί επίσης να περιλαμβάνει κωδικοποίηση αναφορών και διαχείριση μνήμης.
Το FlatBuffers από τη Google παρέχει μέγιστη ταχύτητα χάρη στην αποσειριοποίηση zero-copy — τα δεδομένα διαβάζονται απευθείας από το δυαδικό buffer χωρίς μετατροπή. Το Protobuf είναι στη δεύτερη θέση, το JSON στην τρίτη. Το XML είναι η πιο αργή μορφή από τις συνήθεις.
Kotlinx Serialization — η καλύτερη επιλογή για νέα έργα σε Kotlin: δημιουργία μεταγλωττιστή, υποστήριξη Kotlin Multiplatform, null safety. Moshi — καλή επιλογή για έργα σε Java, πιο αποδοτικό από Gson. Gson — η πιο απλή βιβλιοθήκη για να ξεκινήσετε, αλλά πιο αργή και χρησιμοποιεί ανάκλαση.
Οι κυκλικές αναφορές οδηγούν σε άπειρη αναδρομή κατά τη σειριοποίηση. Λύσεις: χρησιμοποιείτε αναφορές ID αντί για άμεσες αναφορές σε αντικείμενα, εφαρμόστε ειδικούς προσαρμογείς σειριοποίησης (π.χ. @JsonIgnore στο Jackson) ή επανασχεδιάστε το μοντέλο δεδομένων για να εξαλείψετε τους κύκλους.
Ναι, ιδιαίτερα η αποσειριοποίηση δεδομένων από μη αξιόπιστες πηγές. Οι τρωτότητες αποσειριοποίησης μπορούν να οδηγήσουν σε εκ αποστάσεως εκτέλεση κώδικα. Συστάσεις: μην αποσειριοποιείτε δεδομένα από μη αξιόπιστες πηγές, χρησιμοποιείτε λίστα επιτρεπόμενων κλάσεων κατά την αποσειριοποίηση και επικυρώστε το σχήμα δεδομένων πριν την επεξεργασία.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης