Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 18725|Antwort: 0

[Quelle] Eine Frage zur Serialisierung und Deserialisierung

[Link kopieren]
Veröffentlicht am 27.10.2015 19:07:26 | | | |
Gestern, als ich Datenbanksynchronisationstests gemacht habe, habe ich ein wenig Serialisierungs- und Deserialisierungstechnologie verwendet. Ich abstrahiere die Felder einer Tabelle zu einer Entitätsklasse DiagramInfo, speichere dann die neuen Datensätze des Clients in einer generischen Sammlung, serialisiere diese generische Sammlung und sende sie über TCP an den Server, das sie deserialisiert, und schreibe diese Daten dann in die Datenbank. Das ist wahrscheinlich der Ablauf dieser Operation.

       Serialisierung Ich verwende die System.Runtime.Serialization.Iformatter-Klasse, um generische Sammlungen in binäre Streams zu serialisieren. Ein Teil des serialisierten Codes lautet wie folgt:

  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.         }
Code kopieren
Dann senden Sie mit dem TCP-Protokoll, dieser Teil wird weggelassen.

Der Server empfängt die Daten teilweise, speichert sie als MemoryStream und deserialisiert sie dann; ein Teil des Codes ist wie folgt:
  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();
Code kopieren
Führen Sie zu diesem Zeitpunkt Client und Server aus, um die Daten zu synchronisieren, und die folgende Fehlermeldung erscheint:
Fehlerverhalten: Diagramme = (Listen)Formater. Deserialize(memstream);
Wörtlich: Ich bin auf das Ende des Streams gestoßen, bevor die Umwandlung abgeschlossen war.
2. LösungNach einer Google-Suche beantwortete jemand folgende Fehlermöglichkeiten:
1. Die Arten der Serialisierung und Deserialisierung unterscheiden sich, was hier ausgeschlossen werden kann;
2. Es gibt keinen Puffer, um den Strom während der Serialisierung zu löschen, und die Flush()-Methode wird nicht verwendet, was hier ebenfalls ausgeschlossen werden kann.
3. Die Puffergröße des Empfangsprozesses vor der Deserialisierung ist möglicherweise nicht ausreichend, ich denke, das sollte kein Problem sein, Deserialisierung erfolgt nach dem Erwerbsstrom, es sollte nichts mit der Größe des Puffers zu tun haben, persönliche Meinung, ich habe es nicht ausprobiert;
4. Vor der Deserialisierung hinzufügenStrem. Position=0。 (Stream ist der Stream, der deserialisiert werden soll, eigentlich memstream)
Nach dem Test könnte der vierte für mein Programm funktionieren. Warum passiert das also? Nach einem einzigen Debugging-Schritt beobachten Sie den Memstream. Der Wert von Postion ändert sich, und es stellt sich heraus, dass jedes Mal, wenn eine Schreiboperation durchgeführt wird, der Wert auf das Ende zeigt, was erklärt, warum das Programm einen solchen Fehler meldet. Was ich aber nicht verstehe, ist, warum die Deserialisierungsfunktion (Deserialize) statt standardmäßig den gesamten Stream zu deserialisieren, beginnend bei der Position?





Vorhergehend:String[3]: Die Eigenschaft Size hat eine ungültige Größe von 0.
Nächster:vs2010 Connection Server vss2005 Zeitfehler, das Problem ist wie in der Abbildung gezeigt, bitte um Gottes Hilfe
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com