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:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
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:
- 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();
Code kopierenFü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?
|