Gisteren, toen ik database-synchronisatietests deed, gebruikte ik wat serialisatie- en deserialisatietechnologie. Ik abstraheer de velden van een tabel tot een entiteitsklasse DiagramInfo, sla vervolgens de nieuwe records van de client op in een generieke collectie, serialiseer deze generieke collectie vervolgens en stuur deze via TCP naar de server, die het deserialiseert, en schrijf deze data vervolgens naar de database. Dit is waarschijnlijk het proces van deze operatie.
Serialisatie Ik gebruik de klasse System.Runtime.Serialization.Iformatter om generieke collecties te serialiseren in binaire stromen. Een deel van de geserialiseerde code is als volgt:
- 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 kopiëren Stuur dan via het TCP-protocol, dit deel wordt weggelaten.
De server ontvangt de data gedeeltelijk, slaat deze op als een MemoryStream en deserialiseert deze vervolgens; een deel van de code is als volgt:
- 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 kopiërenOp dit moment voer je de client en server uit om de data te synchroniseren, en verschijnt het volgende foutbericht: Foutgedrag: diagrammen = (Lijst)formatier. Deserialize(memstream); Letterlijk: kwam het einde van de stream tegen voordat de conversie voltooid was. 2. OplossingNa een Google-zoekopdracht gaf iemand de volgende foutmogelijkheden op:1. De typen serialisatie en deserialisatie zijn verschillend, wat hier kan worden uitgesloten; 2. Er is geen buffer om de stroom te wissen tijdens serialisatie, en de Flush()-methode wordt niet gebruikt, wat hier ook kan worden uitgesloten. 3. De buffergrootte van het ontvangende proces vóór deserialisatie is misschien niet voldoende, ik denk dat daar geen probleem mee zou moeten zijn, deserialisatie wordt uitgevoerd na de acquisitiestroom, het zou niets te maken moeten hebben met de grootte van de buffer, persoonlijke mening, ik heb het niet geprobeerd; 4. Toevoegen vóór deserialisatieStrem. Positie=0。 (Stream is de stream die gedeserialiseerd moet worden, eigenlijk memstream) Na het testen kan de vierde voor mijn programma werken. Dus waarom gebeurt dit, na één stap van debuggen, observeer de memstream. De waarde van Postion verandert, en het blijkt dat elke keer dat een schrijfoperatie wordt uitgevoerd, de waarde naar het einde wijst, wat verklaart waarom het programma zo'n fout rapporteert. Maar wat ik niet begrijp is waarom de deserialisatiefunctie (Deserialiseren) in plaats van standaard de hele stream te deserialiseren, beginnend vanaf waar de positie is?
|