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:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
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:
- 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();
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?
|