Χθες, όταν έκανα δοκιμές συγχρονισμού βάσεων δεδομένων, χρησιμοποίησα λίγη τεχνολογία σειριοποίησης και αποσειριοποίησης. Αφαιρώ τα πεδία ενός πίνακα σε μια κλάση οντότητας DiagramInfo, στη συνέχεια αποθηκεύω τις νέες εγγραφές του πελάτη σε μια γενική συλλογή και, στη συνέχεια, σειριοποιώ αυτήν τη γενική συλλογή και τη στέλνω στον διακομιστή μέσω TCP, ο οποίος την αποσειριοποιεί και στη συνέχεια γράφει αυτά τα δεδομένα στη βάση δεδομένων. Αυτή είναι πιθανώς η διαδικασία αυτής της επιχείρησης.
Σειριοποίηση Χρησιμοποιώ την κλάση System.Runtime.Serialization.Iformatter για να σειριοποιήσω γενικές συλλογές σε δυαδικές ροές. Μερικοί από τους σειριακούς κώδικες είναι οι εξής:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Αντιγραφή κώδικα Στη συνέχεια, στείλτε χρησιμοποιώντας το πρωτόκολλο TCP, αυτό το μέρος παραλείπεται.
Ο διακομιστής λαμβάνει εν μέρει τα δεδομένα, τα αποθηκεύει ως MemoryStream και στη συνέχεια τα αποσειριοποιεί, μέρος του κώδικα έχει ως εξής:
- do
- {
- bytesRead = stream.Read(responseBuffer, 0, bufferSize);
- memstream.Write(responseBuffer, 0, bytesRead);
- }
- while (bytesRead > 0);
- IFormatter formater = new BinaryFormatter();
- diagrams = (List)formater.Deserialize(memstream);
- stream.Close();
- memstream.Close();
- client.Close();
Αντιγραφή κώδικαΑυτή τη στιγμή, εκτελέστε τον υπολογιστή-πελάτη και το διακομιστή για να συγχρονίσετε τα δεδομένα και εμφανίζεται το ακόλουθο μήνυμα λάθους: Συμπεριφορά σφάλματος: diagrams = (List)formater. Αποσειριοποίηση(memstream); Κυριολεκτικά: συνάντησε το τέλος του ρεύματος πριν ολοκληρωθεί η μετατροπή. 2. ΛύσηΜετά από μια αναζήτηση στο Google, κάποιος απάντησε στις ακόλουθες πιθανότητες σφάλματος:1. Οι τύποι σειριοποίησης και αποσειριοποίησης είναι διαφορετικοί, οι οποίοι μπορούν να εξαιρεθούν εδώ. 2. Δεν υπάρχει buffer για την εκκαθάριση της ροής κατά τη σειριοποίηση και δεν χρησιμοποιείται η μέθοδος Flush(), η οποία μπορεί επίσης να αποκλειστεί εδώ. 3. Το μέγεθος του buffer της διαδικασίας λήψης πριν από την αποσειριοποίηση μπορεί να μην είναι αρκετό, νομίζω ότι δεν πρέπει να υπάρχει πρόβλημα με αυτό, η αποσειριοποίηση πραγματοποιείται μετά τη ροή απόκτησης, δεν πρέπει να έχει καμία σχέση με το μέγεθος του buffer, προσωπική γνώμη, δεν το έχω δοκιμάσει. 4. Προσθέστε πριν από την αποσειριοποίησηστρεμ. Θέση=0。 (Το ρεύμα είναι το ρεύμα που πρέπει να αποσειριοποιηθεί, στην πραγματικότητα memstream) Μετά τη δοκιμή, το τέταρτο μπορεί να λειτουργήσει για το πρόγραμμά μου. Γιατί λοιπόν συμβαίνει αυτό, μετά από ένα μόνο βήμα εντοπισμού σφαλμάτων, παρατηρήστε το memstream. Η τιμή του Postion αλλάζει και διαπιστώνεται ότι κάθε φορά που εκτελείται μια λειτουργία εγγραφής, η τιμή δείχνει στο τέλος, γεγονός που εξηγεί γιατί το πρόγραμμα αναφέρει ένα τέτοιο σφάλμα. Αλλά αυτό που δεν καταλαβαίνω είναι γιατί η συνάρτηση αποσειριοποίησης (Deserialize) αντί να αποσειριοποιήσετε ολόκληρη τη ροή από προεπιλογή, ξεκινώντας από εκεί που βρίσκεται το Positon;
|