I går, da jeg gjorde testing av databasesynkronisering, brukte jeg litt serialiserings- og deserialiseringsteknologi. Jeg abstraherer feltene i en tabell til en entitetsklasse DiagramInfo, lagrer deretter de nye postene til klienten i en generisk samling, og serialiserer deretter denne generiske samlingen og sender den til serveren via TCP, som deserialiserer den, og skriver deretter disse dataene til databasen. Dette er sannsynligvis prosessen i denne operasjonen.
Serialisering Jeg bruker klassen System.Runtime.Serialization.Iformatter for å serialisere generiske samlinger i binære strømmer. Noe av den serialiserte koden er som følger:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopier koden Send deretter med TCP-protokollen, denne delen utelates.
Serveren mottar delvis dataene, lagrer dem som en MemoryStream, og deserialiserer dem deretter, en del av koden er som følger:
- 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();
Kopier kodenPå dette tidspunktet kjører klient og server for å synkronisere dataene, og følgende feilmelding vises: Feiloppførsel: diagrammer = (Liste)formater. Deserialize(memstream); Bokstavelig talt: møtte enden av strømmen før konverteringen var fullført. 2. LøsningEtter et Google-søk svarte noen på følgende feilmuligheter:1. Typene serialisering og deserialisering er forskjellige, noe som kan utelukkes her; 2. Det finnes ingen buffer for å rydde strømmen under serialisering, og Flush()-metoden brukes ikke, noe som også kan utelukkes her. 3. Bufferstørrelsen på mottaksprosessen før deserialisering kan være utilstrekkelig, jeg mener det ikke bør være noe problem med dette, deserialisering utføres etter anskaffelsesstrømmen, det bør ikke ha noe med bufferens størrelse å gjøre, personlig mening, jeg har ikke prøvd det; 4. Legg til før deserialiseringStrem. Posisjon=0。 (Stream er streamen som skal deserialiseres, egentlig memstream) Etter testing kan det fjerde fungere for mitt program. Så hvorfor skjer dette? Etter ett enkelt steg med feilsøking, observer memstreamen. Postions verdi endres, og det viser seg at hver gang en skriveoperasjon utføres, peker verdien mot slutten, noe som forklarer hvorfor programmet rapporterer en slik feil. Men det jeg ikke forstår, er hvorfor deserialiseringsfunksjonen (Deserialize) i stedet for å deserialisere hele strømmen som standard, med utgangspunkt der Positon er?
|