Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 18725|Vastaus: 0

[Lähde] Yksi kysymys sarjoituksesta ja deserialisaatiosta

[Kopioi linkki]
Julkaistu 27.10.2015 19.07.26 | | | |
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:

  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.         }
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:
  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();
Kopioi koodi
Tä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?





Edellinen:String[3]: Size-ominaisuudella on virheellinen koko 0.
Seuraava:vs2010 connection server vss2005 -aikavirhe, ongelma on kuten kuvassa näkyy, pyydä Jumalan apua
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com