Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 18725|Atsakyti: 0

[Šaltinis] Vienas klausimas apie serializaciją ir deserializaciją

[Kopijuoti nuorodą]
Paskelbta 2015-10-27 19:07:26 | | | |
Vakar, kai aš darau duomenų bazės sinchronizavimo bandymus, aš naudojau šiek tiek serializavimo ir deserializavimo technologijos. Aš abstrahuoti lentelės laukus į objekto klasę DiagramInfo, tada saugoti naujus įrašus kliento bendrajame rinkinyje, ir tada serijos šį bendrąjį rinkinį ir siųsti jį į serverį per TCP, kuris deserializuoja jį, ir tada įrašo šiuos duomenis į duomenų bazę. Tai tikriausiai yra šios operacijos procesas.

       Serializacija Naudoju System.Runtime.Serialization.Iformatter klasę, kad suskirstyčiau bendruosius rinkinius į dvejetainius srautus. Kai kurie nuoseklūs kodai yra tokie:

  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.         }
Kopijuoti kodą
Tada siųskite naudodami TCP protokolą, ši dalis praleidžiama.

Serveris iš dalies gauna duomenis, išsaugo juos kaip "MemoryStream" ir tada deserializuoja, dalis kodo yra tokia:
  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();
Kopijuoti kodą
Šiuo metu paleiskite klientą ir serverį, kad sinchronizuotumėte duomenis, ir pasirodys šis klaidos pranešimas:
Klaidos elgesys: diagramos = (Sąrašas) formateris. Deserialize(memstream);
Pažodžiui: susidūrė su srauto pabaiga prieš konvertavimą buvo baigtas.
2. SprendimasPo "Google" paieškos kažkas atsakė į šias klaidų galimybes:
1. Serializacijos ir deserializacijos tipai yra skirtingi, kuriuos čia galima neįtraukti;
2. Nėra buferio, kad būtų galima išvalyti srautą serializavimo metu, o Flush() metodas nenaudojamas, kurį čia taip pat galima neįtraukti.
3. Priėmimo proceso buferio dydžio prieš deserializaciją gali nepakakti, manau, kad dėl to neturėtų kilti problemų, deserializacija atliekama po įsigijimo srauto, tai neturėtų turėti nieko bendra su buferio dydžiu, asmenine nuomone, aš to nebandžiau;
4. Pridėti prieš deserializavimąstrem. Pozicija = 0。 (Srautas yra srautas, kuris turi būti deserializuotas, iš tikrųjų memstream)
Po testavimo, ketvirtasis gali dirbti mano programa. Taigi, kodėl tai vyksta, po vieno derinimo žingsnio stebėkite memstream. Postion reikšmė keičiasi ir nustatoma, kad kiekvieną kartą, kai atliekama rašymo operacija, reikšmė nurodo pabaigą, o tai paaiškina, kodėl programa praneša apie tokią klaidą. Bet aš nesuprantu, kodėl deserializacijos funkcija (Deserialize), užuot deserializavus visą srautą pagal numatytuosius nustatymus, pradedant nuo ten, kur yra Positon?





Ankstesnis:String[3]: ypatybės Dydis dydis yra neleistinas 0.
Kitą:vs2010 ryšio serveris vss2005 laiko klaida, problema yra tokia, kaip parodyta paveikslėlyje, paprašykite Dievo pagalbos
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com