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