Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 18725|Válasz: 0

[Forrás] Egy kérdés a serializációról és deserializációról

[Linket másol]
Közzétéve 2015. 10. 27. 19:07:26 | | | |
Tegnap, amikor adatbázis szinkronizációs tesztet végeztem, egy kis serializációs és deserializációs technológiát használtam. Egy tábla mezőit egy entitásosztályba, DiagramInfo-ba absztrakciózom, majd az ügyfél új rekordjait egy általános gyűjteményben tárolom, majd ezt az általános gyűjteményt serializálom, és TCP-n keresztül elküldöm a szervernek, amely deserializálja, majd ezt az adatokat az adatbázisba írja. Valószínűleg ez a művelet folyamata.

       Serializáció esetén a System.Runtime.Serialization.Iformatter osztályt használom az általános gyűjtemények bináris folyamokká sorolására. Néhány sorizott kód a következő:

  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.         }
Kód másolása
Ezután a TCP protokollal küldj, ez a rész kimarad.

A szerver részben fogadja az adatokat, MemoryStreamként menti el, majd deserializálja, a kód egy része a következő:
  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();
Kód másolása
Ekkor futtatjuk a klienst és a szervert az adatok szinkronizálásához, és a következő hibaüzenet jelenik meg:
Hibaviselkedés: diagramok = (Lista)formázó. Deserialize (memstream);
Szó szerint: a folyam végét érte el, mielőtt az átalakítás befejeződött volna.
2. MegoldásEgy Google-keresés után valaki a következő hibalehetőségekre válaszolt:
1. A serializáció és deserializáció típusai eltérőek, amelyeket itt ki lehet zárni;
2. Nincs puffer a sorozatolás során a stream törlésére, és a Flush() módszert nem használják, ami itt szintén kizárható.
3. A fogadó folyamat puffermérete a deserializáció előtt talán nem elég, szerintem ezzel nem lehet gond, a deserializáció a beszerzési folyam után történik, ennek semmi köze nem lehet a puffer méretéhez, személyes véleményem, még nem próbáltam;
4. Add hozzá deserializáció előttStrem. Pozíció=0。 (A stream az a stream, amit deserializálni, valójában memstream)
A tesztelés után a negyedik talán működhet a programomnál. Akkor miért történik ez, ha egyetlen hibakeresési lépés után figyeljük meg a memstreamet? A Postion értéke változik, és kiderül, hogy minden írási műveletnél az érték a végére mutat, ami megmagyarázza, miért jelent a program ilyen hibát. De amit nem értek, az az, hogy miért a deserializációs függvény (Deserialize) ahelyett, hogy alapértelmezés szerint az egész stream deserializálja, onnan kezdve az Poziton?





Előző:String[3]: a Size tulajdonság érvénytelen mérete 0.
Következő:vs2010 connection server vss2005 idő hiba, a probléma ahogy az ábrán is látható, kérj segítséget az istentől
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com