Eile, kui tegin andmebaasi sünkroniseerimistesti, kasutasin natuke seriaaliseerimise ja deserialiseerimise tehnoloogiat. Ma abstraktin tabeli väljad entiteediklassi DiagramInfo, salvestan kliendi uued kirjed üldisse kollektsiooni, seejärel serialiseerin selle üldise kogu ja saadan serverisse TCP kaudu, mis deserialiseerib selle ja kirjutab andmed andmebaasi. See on tõenäoliselt selle operatsiooni protsess.
Serialiseerimine Kasutan klassi System.Runtime.Serialization.Iformatter generiliste kogumike serialiseerimiseks binaarvoogudeks. Mõned seriaalkoodid on järgmised:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopeeri kood Seejärel saada TCP protokolliga, see osa jäetakse välja.
Server võtab andmed osaliselt vastu, salvestab need MemoryStreamina ja seejärel deserialiseerib need, osa koodist on järgmine:
- 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();
Kopeeri koodSel ajal käivita klient ja server andmete sünkroniseerimiseks ning ilmub järgmine veateade: Veakäitumine: diagrammid = (List)vormindaja. Deserialize (memstream); Sõna otseses mõttes: jõudsin voolu lõpuni enne, kui ümberehitus oli lõppenud. 2. LahendusPärast Google'i otsingut vastas keegi järgmistele veavõimalustele:1. Serialiseerimise ja deserialiseerimise tüübid on erinevad, mida siin võib välistada; 2. Seriaaliseerimise ajal puudub puhver, mis voogu puhastaks, ning Flush() meetodit ei kasutata, mida võib samuti siin välistada. 3. Vastuvõtuprotsessi puhvri suurus enne deserialiseerimist ei pruugi olla piisav, arvan, et sellega ei tohiks probleemi olla, deserialiseerimine toimub pärast omandamisvoogu, see ei tohiks olla seotud puhvri suurusega, isiklik arvamus, ma pole seda proovinud; 4. Lisa enne deserialiseerimiststrem. Positsioon=0。 (Stream on voog, mida tuleb deserialiseerida, tegelikult memstream) Pärast testimist võib neljas variant minu programmis sobida. Miks see siis juhtub, kui pärast ühte silumissammu jälgi memstreami. Postioni väärtus muutub ning leitakse, et iga kord, kui tehakse kirjutamisoperatsioon, osutab väärtus lõppu, mis seletab, miks programm sellise vea teatab. Aga mida ma ei mõista, on see, miks deserialiseerimisfunktsioon (Deserialise) selle asemel, et vaikimisi kogu voogu deserialiseerida, alustades sealt, kus positon asub?
|