See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 18725|Vastuse: 0

[Allikas] Üks küsimus serialiseerimise ja deserialiseerimise kohta

[Kopeeri link]
Postitatud 27.10.2015 19:07:26 | | | |
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:

  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.         }
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:
  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();
Kopeeri kood
Sel 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?





Eelmine:String[3]: Suuruse omadusel on kehtetu suurus 0.
Järgmine:vs2010 ühendusserveri vss2005 ajaviga, probleem on nagu joonisel näidatud – palu jumala abi
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com