Igår när jag gjorde databassynkroniseringstester använde jag lite serialiserings- och deserialiseringsteknologi. Jag abstraherar fälten i en tabell till entitetsklassen DiagramInfo, lagrar sedan klientens nya poster i en generisk samling, och serialiserar sedan denna generiska samling och skickar den till servern via TCP, som deserialiserar den, och skriver sedan denna data till databasen. Detta är troligen processen för denna operation.
Serialisering Jag använder klassen System.Runtime.Serialization.Iformatter för att serialisera generiska samlingar till binära strömmar. En del av den serialiserade koden är följande:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopiera koden Skicka sedan med TCP-protokollet, denna del utelämnas.
Servern tar delvis emot datan, sparar den som en MemoryStream och deserialiserar den sedan, en del av koden är följande:
- 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();
Kopiera kodenVid denna tidpunkt kör klient och server för att synkronisera datan, och följande felmeddelande dyker upp: Felbeteende: diagrams = (List)formater. Deserialize (memstream); Bokstavligen: mötte slutet av strömmen innan konverteringen var klar. 2. LösningEfter en Google-sökning svarade någon på följande felmöjligheter:1. Typerna av serialisering och deserialisering skiljer sig åt, vilket kan uteslutas här; 2. Det finns ingen buffert för att rensa strömmen under serialisering, och Flush()-metoden används inte, vilket också kan uteslutas här. 3. Buffertstorleken på mottagningsprocessen före deserialisering kanske inte är tillräcklig, jag tycker inte att det borde vara något problem med detta, deserialisering sker efter förvärvsströmmen, det borde inte ha något att göra med buffertens storlek, personlig åsikt, jag har inte provat det; 4. Lägg till före deserialiseringStrem. Position=0。 (Stream är den stream som ska deserialiseras, egentligen memstream) Efter testning kan den fjärde fungera för mitt program. Så varför händer detta, efter ett enda steg av felsökning, observera memstreamen. Postions värde ändras, och det visar sig att varje gång en skrivoperation utförs pekar värdet mot slutet, vilket förklarar varför programmet rapporterar ett sådant fel. Men det jag inte förstår är varför deserialiseringsfunktionen (Deserialize) istället för att deserialisera hela strömmen som standard, med start där Positon är?
|