Eilen, kun tein tietokannan synkronointitestausta, käytin hieman serialisointi- ja deserialisointiteknologiaa. Abstrahoitan taulun kentät entiteettiluokkaan DiagramInfo, tallennan asiakkaan uudet tietueet yleiseen kokoelmaan, sarjoitan tämän geneerisen kokoelman ja lähetän sen palvelimelle TCP:n kautta, joka deserialisoi sen, ja kirjoitan tämän datan tietokantaan. Tämä on todennäköisesti tämän operaation prosessi.
Serialisointi Käytän System.Runtime.Serialization.Iformatter -luokkaa generisten kokoelmien sarjoittamiseen binäärivirroiksi. Osa sarjallistetusta koodista on seuraava:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopioi koodi Sitten lähetä TCP-protokollalla, tämä osa jätetään pois.
Palvelin vastaanottaa datan osittain, tallentaa sen MemoryStream-muodossa ja deserialisoi sen, osa koodista on seuraava:
- 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();
Kopioi koodiTällöin ajat asiakkaan ja palvelimen synkronoimaan tiedot, ja seuraava virheilmoitus ilmestyy: Virhekäyttäytyminen: diagrammit = (List)formater. Deserialize (memstream); Kirjaimellisesti: kohtasin virran lopun ennen muunnoksen valmistumista. 2. RatkaisuGoogle-haun jälkeen joku vastasi seuraaviin virhemahdollisuuksiin:1. Sarjoittamisen ja deserialisaation tyypit ovat erilaisia, jotka voidaan jättää pois tästä; 2. Virtauksen tyhjentämiseen ei ole puskuria, eikä Flush()-menetelmää käytetä, mikä voidaan myös jättää pois tässä. 3. Vastaanottoprosessin puskurin koko ennen deserialisointia ei välttämättä riitä, mielestäni tässä ei pitäisi olla ongelmaa, deserialisointi tehdään hankintavirran jälkeen, sillä ei pitäisi olla mitään tekemistä puskurin koon kanssa, henkilökohtainen mielipide, en ole kokeillut sitä; 4. Lisää ennen deserialisointiastrem. Sijainti=0。 (Stream on stream, joka deserialisoidaan, itse asiassa memstream) Testauksen jälkeen neljäs saattaa toimia ohjelmassani. Miksi tämä siis tapahtuu, yhden virheenkorjausvaiheen jälkeen tarkkaile muistivirtaa. Postionin arvo muuttuu, ja havaitaan, että joka kerta kun kirjoitusoperaatio suoritetaan, arvo osoittaa loppuun, mikä selittää, miksi ohjelma raportoi tällaisen virheen. Mutta en ymmärrä, miksi deserialisointifunktio (Deserialisoi) sen sijaan, että deserialisoisit koko striimin oletuksena, aloittaen siitä, missä Positon on?
|