Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 18725|Odgovoriti: 0

[Vir] Eno vprašanje o serializaciji in deserializaciji

[Kopiraj povezavo]
Objavljeno na 27. 10. 2015 19:07:26 | | | |
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:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
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:
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
Kopiraj kodo
V 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?





Prejšnji:Niz[3]: lastnost Velikost ima neveljavno velikost 0.
Naslednji:vs2010 strežnik povezave vss2005 časovna napaka, težava je, kot je prikazano na sliki, prosite boga za pomoč
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com