Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 18725|Odpoveď: 0

[Zdroj] Jedna otázka ohľadom serializácie a deserializácie

[Kopírovať odkaz]
Zverejnené 27. 10. 2015 19:07:26 | | | |
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é:

  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.         }
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á:
  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();
Kopírovať kód
V 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?





Predchádzajúci:Reťaz[3]: vlastnosť Veľkosť má neplatnú veľkosť 0.
Budúci:vs2010 connection server vss2005 časová chyba, problém je znázornený na obrázku, požiadajte boha o pomoc
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com