Včera, keď som robil testovanie synchronizácie databázy, použil som trochu technológie serializácie a deserializácie. Polia tabuľky abstrahujem do triedy entity DiagramInfo, potom uložím nové záznamy klienta do generickej kolekcie, serializujem túto generickú kolekciu a pošlem ju serveru cez TCP, ktorý ju deserializuje a potom tieto dáta zapíše do databázy. Toto je pravdepodobne proces tejto operácie.
Serializácia Používam triedu System.Runtime.Serialization.Iformatter na serializáciu generických kolekcií do binárnych tokov. Niektoré serializované kódy sú nasledovné:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Kopírovať kód Potom odoslať pomocou protokolu TCP, táto časť je vynechaná.
Server čiastočne prijme dáta, uloží ich ako MemoryStream a následne ich deserializuje, časť kódu je nasledovná:
- 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();
Kopírovať kódV tomto momente spustite klienta a server na synchronizáciu dát a zobrazí sa nasledujúca chybová správa: Správanie chyby: diagramy = (Zoznam)formátovač. Deserializovať (memstream); Doslova: stretol som koniec prúdu skôr, než bola konverzia dokončená. 2. RiešeniePo vyhľadávaní na Googli niekto odpovedal na nasledujúce možnosti chýb:1. Typy serializácie a deserializácie sú odlišné, čo tu možno vylúčiť; 2. Počas serializácie nie je žiadny buffer na vymazanie toku a metóda Flush() sa nepoužíva, ktorú možno tu tiež vylúčiť. 3. Veľkosť bufferu prijímacieho procesu pred deserializáciou nemusí byť dostatočná, myslím, že s tým by nemal byť problém, deserializácia sa vykonáva po akvizičnom prúde, nemalo by to mať nič spoločné s veľkosťou bufferu, osobný názor, neskúšal som to; 4. Pridaj pred deserializácioustrem. Pozícia=0。 (Stream je stream, ktorý sa deserializuje, v skutočnosti memstream) Po testovaní by štvrtý mohol fungovať pre môj program. Prečo sa to deje? Po jednom kroku ladenia sledujte memstream. Hodnota Postionu sa mení a zistilo sa, že zakaždým, keď sa vykoná zápisová operácia, hodnota smeruje na koniec, čo vysvetľuje, prečo program hlási takúto chybu. Ale čo nechápem, je, prečo deserializačná funkcia (Deserializovať) namiesto toho, aby som štandardne deserializoval celý stream, začínajúc tam, kde je pozícia?
|