I går, da jeg lavede databasesynkroniseringstest, brugte jeg lidt serialiserings- og deserialiseringsteknologi. Jeg abstraherer felterne i en tabel til en entitetsklasse DiagramInfo, gemmer derefter klientens nye poster i en generisk samling, serialiserer derefter denne generiske samling og sender den til serveren via TCP, som deserialiserer den, og skriver så disse data til databasen. Dette er sandsynligvis processen for denne operation.
Serialisering Jeg bruger klassen System.Runtime.Serialization.Iformatter til at serialisere generiske samlinger i binære strømme. Noget af den serialiserede kode 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 kode Send derefter med TCP-protokollen, denne del udelades.
Serveren modtager delvist dataene, gemmer dem som en MemoryStream og deserialiserer dem derefter; en del af 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 kodeKør på dette tidspunkt klient og server for at synkronisere dataene, og følgende fejlmeddelelse vises: Fejladfærd: diagrammer = (Liste)formater. Deserialize(memstream); Bogstaveligt talt: mødte enden af strømmen, før konverteringen var fuldført. 2. LøsningEfter en Google-søgning svarede nogen på følgende fejlmuligheder:1. Typerne af serialisering og deserialisering er forskellige, hvilket kan udelukkes her; 2. Der er ingen buffer til at rydde strømmen under serialisering, og Flush()-metoden bruges ikke, hvilket også kan udelukkes her. 3. Bufferstørrelsen på modtagerprocessen før deserialisering er måske ikke tilstrækkelig, jeg mener, der ikke burde være noget problem med dette, deserialisering udføres efter erhvervelsesstrømmen, det bør ikke have noget at gøre med bufferens størrelse, personlig mening, jeg har ikke prøvet det; 4. Tilføj før deserialiseringStrem. Position=0。 (Stream er den stream, der skal deserialiseres, faktisk memstream) Efter testning kan den fjerde måske fungere for mit program. Så hvorfor sker det her? Efter et enkelt trin med fejlfinding skal du observere memstreamen. Postions værdi ændres, og det viser sig, at hver gang en skriveoperation udføres, peger værdien mod slutningen, hvilket forklarer, hvorfor programmet rapporterer en sådan fejl. Men det, jeg ikke forstår, er, hvorfor deserialiseringsfunktionen (Deserialize) i stedet for at deserialisere hele strømmen som standard, startende der, hvor Positon er?
|