Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 18725|Απάντηση: 0

[Πηγή] Μια ερώτηση σχετικά με τη σειριοποίηση και την αποσειριοποίηση

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 27/10/2015 7:07:26 μ.μ. | | | |
Χθες, όταν έκανα δοκιμές συγχρονισμού βάσεων δεδομένων, χρησιμοποίησα λίγη τεχνολογία σειριοποίησης και αποσειριοποίησης. Αφαιρώ τα πεδία ενός πίνακα σε μια κλάση οντότητας DiagramInfo, στη συνέχεια αποθηκεύω τις νέες εγγραφές του πελάτη σε μια γενική συλλογή και, στη συνέχεια, σειριοποιώ αυτήν τη γενική συλλογή και τη στέλνω στον διακομιστή μέσω TCP, ο οποίος την αποσειριοποιεί και στη συνέχεια γράφει αυτά τα δεδομένα στη βάση δεδομένων. Αυτή είναι πιθανώς η διαδικασία αυτής της επιχείρησης.

       Σειριοποίηση Χρησιμοποιώ την κλάση System.Runtime.Serialization.Iformatter για να σειριοποιήσω γενικές συλλογές σε δυαδικές ροές. Μερικοί από τους σειριακούς κώδικες είναι οι εξής:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
Αντιγραφή κώδικα
Στη συνέχεια, στείλτε χρησιμοποιώντας το πρωτόκολλο TCP, αυτό το μέρος παραλείπεται.

Ο διακομιστής λαμβάνει εν μέρει τα δεδομένα, τα αποθηκεύει ως MemoryStream και στη συνέχεια τα αποσειριοποιεί, μέρος του κώδικα έχει ως εξής:
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
Αντιγραφή κώδικα
Αυτή τη στιγμή, εκτελέστε τον υπολογιστή-πελάτη και το διακομιστή για να συγχρονίσετε τα δεδομένα και εμφανίζεται το ακόλουθο μήνυμα λάθους:
Συμπεριφορά σφάλματος: diagrams = (List)formater. Αποσειριοποίηση(memstream);
Κυριολεκτικά: συνάντησε το τέλος του ρεύματος πριν ολοκληρωθεί η μετατροπή.
2. ΛύσηΜετά από μια αναζήτηση στο Google, κάποιος απάντησε στις ακόλουθες πιθανότητες σφάλματος:
1. Οι τύποι σειριοποίησης και αποσειριοποίησης είναι διαφορετικοί, οι οποίοι μπορούν να εξαιρεθούν εδώ.
2. Δεν υπάρχει buffer για την εκκαθάριση της ροής κατά τη σειριοποίηση και δεν χρησιμοποιείται η μέθοδος Flush(), η οποία μπορεί επίσης να αποκλειστεί εδώ.
3. Το μέγεθος του buffer της διαδικασίας λήψης πριν από την αποσειριοποίηση μπορεί να μην είναι αρκετό, νομίζω ότι δεν πρέπει να υπάρχει πρόβλημα με αυτό, η αποσειριοποίηση πραγματοποιείται μετά τη ροή απόκτησης, δεν πρέπει να έχει καμία σχέση με το μέγεθος του buffer, προσωπική γνώμη, δεν το έχω δοκιμάσει.
4. Προσθέστε πριν από την αποσειριοποίησηστρεμ. Θέση=0。 (Το ρεύμα είναι το ρεύμα που πρέπει να αποσειριοποιηθεί, στην πραγματικότητα memstream)
Μετά τη δοκιμή, το τέταρτο μπορεί να λειτουργήσει για το πρόγραμμά μου. Γιατί λοιπόν συμβαίνει αυτό, μετά από ένα μόνο βήμα εντοπισμού σφαλμάτων, παρατηρήστε το memstream. Η τιμή του Postion αλλάζει και διαπιστώνεται ότι κάθε φορά που εκτελείται μια λειτουργία εγγραφής, η τιμή δείχνει στο τέλος, γεγονός που εξηγεί γιατί το πρόγραμμα αναφέρει ένα τέτοιο σφάλμα. Αλλά αυτό που δεν καταλαβαίνω είναι γιατί η συνάρτηση αποσειριοποίησης (Deserialize) αντί να αποσειριοποιήσετε ολόκληρη τη ροή από προεπιλογή, ξεκινώντας από εκεί που βρίσκεται το Positon;





Προηγούμενος:String[3]: η ιδιότητα Size έχει μη έγκυρο μέγεθος 0.
Επόμενος:Διακομιστής σύνδεσης vs2010 VSS2005 Σφάλμα χρόνου, το πρόβλημα είναι όπως φαίνεται στο σχήμα, ζητήστε τη βοήθεια του Θεού
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com