Η σειριοποίηση είναι η διαδικασία μετατροπής ενός αντικειμένου σε γραμμική ακολουθία bytes που ονομάζεται "ροή byte". Η αποεπεξεργασία απλώς αντιστρέφει τη διαδικασία. Αλλά γιατί θα θέλατε να μετατρέψετε ένα αντικείμενο σε ροή byte;
Ο κύριος λόγος είναι να μπορείτε να μετακινήσετε το αντικείμενο γύρω. Εξετάστε τις δυνατότητες. Δεδομένου ότι "όλα είναι ένα αντικείμενο" στο .NET, μπορείτε να κάνετε serialization οτιδήποτε και να το αποθηκεύσετε σε ένα αρχείο. Έτσι μπορείτε να κάνετε σειριοποίηση εικόνων, αρχείων δεδομένων, η τρέχουσα κατάσταση μιας ενότητας προγράμματος ('state' είναι σαν a στιγμιότυπο του προγράμματός σας σε μια χρονική στιγμή, ώστε να μπορείτε να διακόψετε προσωρινά την εκτέλεση και να ξεκινήσετε ξανά αργότερα)... ό, τι χρειάζεται να κάνετε.
Μπορείτε επίσης να αποθηκεύσετε αυτά τα αντικείμενα στο δίσκο σε αρχεία, να τα στείλετε στον ιστό, να τα μεταβιβάσετε σε άλλο πρόγραμμα, να διατηρήσετε αντίγραφο ασφαλείας για ασφάλεια ή ασφάλεια. Οι δυνατότητες είναι κυριολεκτικά ατελείωτες.
Γι 'αυτό το serialization είναι μια τόσο σημαντική διαδικασία στο .NET και Visual Basic. Παρακάτω υπάρχει μια ενότητα σχετικά με την προσαρμοσμένη σειριοποίηση εφαρμόζοντας το ISerializable διεπαφή και κωδικοποίηση α Νέος και ένα GetObjectDataυπορουτίνα.
Ως πρώτο παράδειγμα της σειριοποίησης, ας κάνουμε ένα από τα ευκολότερα προγράμματα, αλλά και ένα από τα πιο χρήσιμα: σειριοποίηση δεδομένων, και έπειτα αποεριοποίηση δεδομένων σε απλή κλάση από και προς ένα αρχείο. Σε αυτό το παράδειγμα, τα δεδομένα δεν είναι μόνο σειριοποιημένα, αλλά η δομή των δεδομένων σώζεται επίσης. Η δομή εδώ δηλώνεται σε μια ενότητα για να διατηρούνται τα πράγματα... Καλά... δομημένος.
Ενότητα SerializeParms
Δημόσια Parm1Name ως String = "Parm1 Name"
Δημόσια Parm1Value ως Integer = 12345
Δημόσια Parm2Name ως String
Δημόσια Parm2Value ως δεκαδική
Τέλος κλάσης
Ενότητα τελών
Στη συνέχεια, οι μεμονωμένες τιμές μπορούν να αποθηκευτούν σε ένα αρχείο όπως αυτό:
Σύστημα εισαγωγών. Χρόνος εκτέλεσης. Σειρά. Μορφοποιητές. Δυάδικος
Σύστημα εισαγωγών. IO
Δημόσια Κλάση1
Private Sub mySerialize_Click (_
ByVal αποστολέας ως σύστημα. Αντικείμενο, _
ByVal e ως σύστημα. EventArgs) _
Χειριστείτε το mySerialize. Κάντε κλικ
Dim ParmData ως νέο ParmExample
ParmData. Parm2Name = "Όνομα Parm2"
ParmData. Parm2Value = 54321.12345
Dims ως νέο FileStream ("ParmInfo", FileMode. Δημιουργώ)
Dim f Ως νέο BinaryFormatter
φά. Serialize (s, ParmData)
μικρό. Κλείσε()
End Sub
Τέλος κλάσης
Και αυτές οι ίδιες τιμές μπορούν να ανακτηθούν ως εξής:
Σύστημα εισαγωγών. Χρόνος εκτέλεσης. Σειρά. Μορφοποιητές. Δυάδικος
Σύστημα εισαγωγών. IO
Δημόσια Κλάση1
Private Sub myDeserialize_Click (_
ByVal αποστολέας ως σύστημα. Αντικείμενο, _
ByVal e ως σύστημα. EventArgs) _
Χειριστήρια myDeserialize. Κάντε κλικ
Dim s = Νέο FileStream ("ParmInfo", FileMode. Ανοιξε)
Dim f Ως νέο BinaryFormatter
Dim RestoredParms ως νέο ParmExample
RestoredParms = f. Αποστειροποίηση (ες)
μικρό. Κλείσε()
Κονσόλα. Γράφημα WriteLine (RestoredParms. Parm1Name)
Κονσόλα. Γράφημα WriteLine (RestoredParms. Parm1Value)
Κονσόλα. Γράφημα WriteLine (RestoredParms. Parm2Name)
Κονσόλα. Γράφημα WriteLine (RestoredParms. Parm2Value)
End Sub
Τέλος κλάσης
ΕΝΑ Δομή ή μια συλλογή (όπως μια ArrayList) και όχι α Τάξη θα μπορούσε επίσης να είναι σειριοποιημένη σε ένα αρχείο με τον ίδιο τρόπο.
Τώρα που ξεπεράσαμε τη βασική διαδικασία σειριοποίησης, μπορείτε να δείτε τις συγκεκριμένες λεπτομέρειες που αποτελούν μέρος της διαδικασίας στην επόμενη σελίδα.
Ένα από τα πρώτα πράγματα που θα πρέπει να παρατηρήσετε σχετικά με αυτό το παράδειγμα είναι το χαρακτηριστικό στο Τάξη. Γνωρίσματα είναι μόνο περισσότερες πληροφορίες που μπορείτε να παρέχετε στο VB.NET για ένα αντικείμενο και χρησιμοποιούνται για πολλά διαφορετικά πράγματα. Το χαρακτηριστικό σε αυτόν τον κώδικα λέει στο VB.NET να προσθέσει επιπλέον κώδικα έτσι ώστε αργότερα, όλα σε αυτήν την κλάση να μπορούν να κατατετμηθούν.
Εάν υπάρχουν συγκεκριμένα στοιχεία στην κλάση που εσείς όχι θέλετε να κάνετε σειριοποίηση, μπορείτε να χρησιμοποιήσετε το να αποκλείσετε:
Στο παράδειγμα, η ειδοποίηση είναι ότι Σειρά και Αποκεράστε είναι μέθοδοι του BinaryFormatter αντικείμενο (φά σε αυτό το παράδειγμα).
φά. Serialize (s, ParmData)
Αυτό το αντικείμενο παίρνει το FileStream το αντικείμενο και το αντικείμενο που θα οριστεί ως παράμετροι. Θα δούμε ότι το VB.NET προσφέρει ένα άλλο αντικείμενο που επιτρέπει στο αποτέλεσμα να εκφράζεται ως XML.
Και μια τελευταία σημείωση, εάν το αντικείμενο σας περιλαμβάνει άλλα δευτερεύοντα αντικείμενα, θα είναι και σε σειριοποίηση! Αλλά από τότε όλα αντικείμενα που έχουν σειριοποιηθεί πρέπει να σημειώνεται με το χαρακτηριστικό, όλα αυτά τα παιδικά αντικείμενα πρέπει να επισημαίνονται με αυτόν τον τρόπο.
Για να είμαστε απόλυτα σαφείς για το τι συμβαίνει στο πρόγραμμά σας, μπορεί να θέλετε να εμφανίσετε το αρχείο που ονομάζεται ParmData στο Σημειωματάριο για να δείτε ποια είναι τα σειριοποιημένα δεδομένα. (Εάν ακολουθήσατε αυτόν τον κώδικα, πρέπει να είναι στο αποθήκη. Debug φάκελο στο έργο σας.) Δεδομένου ότι πρόκειται για ένα δυαδικό αρχείο, το μεγαλύτερο μέρος του περιεχομένου δεν είναι αναγνώσιμο κείμενο, αλλά θα πρέπει να μπορείτε να δείτε οποιεσδήποτε συμβολοσειρές στο σειριακό αρχείο σας. Θα κάνουμε μια έκδοση XML και ίσως θελήσετε να συγκρίνετε τα δύο για να γνωρίζετε τη διαφορά.
Η σειριοποίηση σε XML αντί για δυαδικό αρχείο απαιτεί πολύ λίγες αλλαγές. Η XML δεν είναι τόσο γρήγορη και δεν μπορεί να καταγράψει κάποιες πληροφορίες αντικειμένων, αλλά είναι πολύ πιο ευέλικτη. Η XML μπορεί να χρησιμοποιηθεί από σχεδόν οποιαδήποτε άλλη τεχνολογία λογισμικού στον κόσμο σήμερα. Εάν θέλετε να είστε βέβαιοι ότι οι δομές αρχείων σας δεν "δένονται" στη Microsoft, αυτή είναι μια καλή επιλογή για να εξετάσετε. Η Microsoft δίνει έμφαση στο "LINQ to XML" για τη δημιουργία αρχείων δεδομένων XML στην τελευταία τεχνολογία τους, αλλά πολλοί άνθρωποι εξακολουθούν να προτιμούν αυτή τη μέθοδο.
Το 'Χ' στο XML σημαίνει εΧέντατος. Στο παράδειγμα XML μας, πρόκειται να χρησιμοποιήσουμε μία από αυτές τις επεκτάσεις XML, μια τεχνολογία που ονομάζεται ΣΑΠΟΥΝΙ. Αυτό σήμαινε "πρωτόκολλο πρόσβασης απλού αντικειμένου" αλλά τώρα είναι απλώς ένα όνομα. (Το SOAP έχει αναβαθμιστεί τόσο πολύ ώστε το αρχικό όνομα δεν ταιριάζει πια καλά.)
Το κύριο πράγμα που πρέπει να αλλάξουμε στις υπορουτίνες μας είναι η μείωση του μορφοποιητή σειριοποίησης. Αυτό πρέπει να αλλάξει τόσο στην υπορουτίνα που σειριοποιεί το αντικείμενο όσο και σε εκείνη που αποεπιλογίζει ξανά το αντικείμενο. Για την προεπιλεγμένη διαμόρφωση, αυτό περιλαμβάνει τρεις αλλαγές στο πρόγραμμά σας. Πρώτον, πρέπει να προσθέσετε μια αναφορά στο έργο. Κάντε δεξί κλικ στο έργο και επιλέξτε Προσθήκη αναφοράς .... Βεβαιωθείτε ...
Σύστημα. Χρόνος εκτέλεσης. Σειρά. Μορφοποιητές. Σαπούνι
... έχει προστεθεί στο έργο.
Στη συνέχεια, αλλάξτε τις δύο δηλώσεις στο πρόγραμμα που το αναφέρει.
Σύστημα εισαγωγών. Χρόνος εκτέλεσης. Σειρά. Μορφοποιητές. Σαπούνι
Dim f As New SoapFormatter
Αυτή τη φορά, αν το ελέγξετε το ίδιο ParmData αρχείο στο Σημειωματάριο, θα δείτε ότι το όλο θέμα είναι σε αναγνώσιμο κείμενο XML, όπως ...
Υπάρχει επίσης πολλά πρόσθετα XML εκεί που είναι απαραίτητα για το πρότυπο SOAP στο αρχείο επίσης. Αν θέλετε να επαληθεύσετε τι attribute, μπορείτε να προσθέσετε μια μεταβλητή με αυτό το χαρακτηριστικό και να εξετάσετε το αρχείο για να βεβαιωθείτε ότι δεν περιλαμβάνεται.
Το παράδειγμα που μόλις κωδικοποιήσαμε μόνο σειριοποίησε τα δεδομένα, αλλά υποθέστε ότι πρέπει να ελέγξετε τον τρόπο με τον οποίο τα δεδομένα είναι σειριοποιημένα. VB.NET μπορεί να το κάνει αυτό!
Για να επιτευχθεί αυτό, πρέπει να πάρετε λίγο βαθύτερα στην έννοια της σειριοποίησης. Το VB.NET έχει ένα νέο αντικείμενο για να βοηθήσει εδώ: SerializationInfo. Παρόλο που έχετε τη δυνατότητα να κωδικοποιήσετε τη συμπεριφορά προσαρμοσμένης σειριοποίησης, έρχεται με το κόστος της επιπλέον κωδικοποίησης.
Το βασικό επιπλέον Ο παρακάτω κωδικός εμφανίζεται παρακάτω. Θυμηθείτε, αυτή η κλάση χρησιμοποιείται αντί του ParmExample κατηγορίας που παρουσιάστηκε στο προηγούμενο παράδειγμα. Αυτό δεν είναι ένα πλήρες παράδειγμα. Ο σκοπός είναι να σας δείξουμε τον νέο κώδικα που απαιτείται για την προσαρμοσμένη σειριοποίηση.
Σύστημα εισαγωγών. Χρόνος εκτέλεσης. Σειρά
Δημόσια κλάση CustomSerialization
Εφαρμογές ISerializable
'τα δεδομένα που πρέπει να παραπεμφθούν εδώ
Msgstr "Δημόσια σειριακή μεταβλητή ως τύπος
Δημόσιο Νέο ()
'προεπιλεγμένος κατασκευαστής κατά την κλάση
'δημιουργείται - ο κώδικας μπορεί να είναι προσαρμοσμένος
»προστέθηκε και εδώ
End Sub
Δημόσιο Υπο Νέο (_
Πληροφορίες ByVal Ως SerializationInfo, _
ByVal context As StreamingContext)
msgstr "Αρχικοποιήστε τις μεταβλητές του προγράμματος από το
'ένα αποθηκευμένο κατάστημα δεδομένων
End Sub
Δημόσια Sub GetObjectData (_
Πληροφορίες ByVal Ως SerializationInfo, _
ByVal context As StreamingContext) _
Εφαρμογές ISerializable. GetObjectData
'ενημέρωση του καταστήματος σειριακών δεδομένων
'από τις μεταβλητές του προγράμματος
End Sub
Τέλος κλάσης
Η ιδέα είναι ότι τώρα μπορείτε (και, στην πραγματικότητα, εσείς πρέπει) κάνουν όλες τις ενημερώσεις και την ανάγνωση των δεδομένων στο σειριακό κατάστημα δεδομένων στο Νέος και GetObjectData υπορουτίνες. Πρέπει επίσης να συμπεριλάβετε ένα γενικό Νέος constructor (χωρίς λίστα παραμέτρων) επειδή εισάγετε μια διεπαφή.
Η τάξη θα έχει κανονικά τυπικές ιδιότητες και κωδικοποιημένες μεθόδους ...
'Γενική Ιδιοκτησία
Ιδιωτική newPropertyValue ως συμβολοσειρά
Δημόσια ιδιότητα NewProperty () As String
Παίρνω
Επιστροφή newPropertyValue
Τέλος Πάρτε
Ορισμός (τιμή ByVal ως συμβολοσειρά)
newPropertyValue = τιμή
Ορισμός τέλους
End Property
'Γενική μέθοδος
Public Sub MyMethod ()
'κώδικα μεθόδου
End Sub
Η προκύπτουσα σειριακή κλάση μπορεί να δημιουργήσει μοναδικές τιμές στο αρχείο με βάση τον κώδικα που παρέχετε. Για παράδειγμα, μια κλάση ακινήτων μπορεί να επικαιροποιήσει την αξία και τη διεύθυνση ενός σπιτιού, αλλά η τάξη θα σειριοποιήσει μια υπολογισμένη ταξινόμηση της αγοράς επίσης.
ο Νέος η υπορουτίνα θα μοιάζει κάπως έτσι:
Δημόσιο Υπο Νέο (_
Πληροφορίες ByVal Ως SerializationInfo, _
ByVal context As StreamingContext)
msgstr "Αρχικοποιήστε τις μεταβλητές του προγράμματος από το
'ένα αποθηκευμένο κατάστημα δεδομένων
Parm1Name = info. GetString ("α")
Parm1Value = info. GetInt32 ("b")
'Νέο sub συνεχίζεται ...
Πότε Αποκεράστε καλείται α BinaryFormatter αντικείμενο, αυτό το δευτερεύον αντικείμενο εκτελείται και α SerializationInfo αντικείμενο μεταβιβάζεται στο Νέος υπορουτίνα. Τα νέα μπορούν στη συνέχεια να κάνουν ό, τι είναι απαραίτητο με τις σειριακές τιμές δεδομένων. Για παράδειγμα ...
MsgBox ("Αυτό είναι το Parm1Value Times Pi:" _
& (Parm1Value * Math. PI) .ToString)
Το αντίστροφο συμβαίνει όταν Σειρά ονομάζεται, αλλά το BinaryFormatter κλήσεις αντικειμένων GetObjectData αντι αυτου.
Δημόσια Sub GetObjectData (_
Πληροφορίες ByVal Ως SerializationInfo, _
ByVal context As StreamingContext) _
Εφαρμογές ISerializable. GetObjectData
'ενημέρωση του καταστήματος σειριακών δεδομένων
'από τις μεταβλητές του προγράμματος
Εάν Parm2Name = "Test" Στη συνέχεια
πληροφορίες. AddValue ("a", "Πρόκειται για δοκιμή.")
Αλλού
πληροφορίες. AddValue ("a", "Δεν δοκιμάσθηκε αυτή τη φορά.")
Τέλος εαν
πληροφορίες. AddValue ("b", 2)
Παρατηρήστε ότι τα δεδομένα προστίθενται στο σειριακό αρχείο ως ζεύγη ονόματος / τιμής.
Πολλές από τις ιστοσελίδες που βρήκα γραπτώς σε αυτό το άρθρο δεν φαίνεται να έχουν πραγματικό κώδικα εργασίας. Κάποιος αναρωτιέται αν ο συντάκτης πράγματι εκτελέσει οποιοδήποτε κώδικα πριν γράψει το άρθρο μερικές φορές.