Včeraj, ko sem izvajal testiranje sinhronizacije podatkovnih baz, sem uporabil nekaj tehnologije serializacije in deserializacije. Polja tabele abstrahiram v entitetni razred DiagramInfo, nato nove zapise odjemalca shranim v generično zbirko, nato serializiram to generično zbirko in jo pošljem strežniku preko TCP, ki jo deserializira, nato pa te podatke zapiše v bazo podatkov. To je verjetno proces te operacije.
Serializacija Uporabljam razred System.Runtime.Serialization.Iformatter za serializacijo generičnih zbirk v binarne tokove. Nekatere serializirane kode so naslednje:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopiraj kodo Nato pošlji s TCP protokolom, ta del pa izpustimo.
Strežnik delno prejme podatke, jih shrani kot MemoryStream in jih nato deserializira; del kode je naslednji:
- 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();
Kopiraj kodoV tem trenutku zaženite odjemalca in strežnika za sinhronizacijo podatkov in prikaže se naslednje sporočilo o napaki: Vedenje napake: diagrams = (Seznam)formater. Deserialize (memstream); Dobesedno: naletel sem na konec potoka, preden je bila pretvorba dokončana. 2. RešitevPo iskanju na Googlu je nekdo odgovoril na naslednje možnosti napak:1. Vrste serializacije in deserializacije so različne, kar lahko tukaj izključimo; 2. Med serializacijo ni medpomnilnika za čiščenje toka, metoda Flush() pa se ne uporablja, kar je prav tako mogoče izključiti tukaj. 3. Velikost medpomnilnika sprejemnega procesa pred deserializacijo morda ne bo dovolj, mislim, da s tem ne bi smelo biti težav, deserializacija se izvede po toku pridobivanja, ne bi smela imeti nobene zveze z velikostjo medpomnilnika, osebno mnenje, tega nisem preizkusil; 4. Dodaj pred deserializacijoStrem. Pozicija=0。 (Stream je tok, ki ga je treba deserializirati, dejansko memstream) Po testiranju bi četrta morda delovala za moj program. Zakaj se to dogaja? Po enem koraku odpravljanja napak opazujte tok memstreama. Vrednost Postiona se spremeni in ugotovili smo, da se vsakič, ko se izvede operacija zapisovanja, vrednost kaže na konec, kar pojasnjuje, zakaj program poroča o takšni napaki. Kar pa ne razumem, je, zakaj funkcija deserializacije (Deserializiraj) namesto da bi privzeto deserializirali celoten tok, začeli bi tam, kjer je pozicija?
|