Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 18725|Odpověď: 0

[Zdroj] Jedna otázka ohledně serializace a deserializace

[Kopírovat odkaz]
Zveřejněno 27.10.2015 19:07:26 | | | |
Včera, když jsem prováděl testování synchronizace databází, použil jsem trochu technologie serializace a deserializace. Abstrahuji pole tabulky do entity třídy DiagramInfo, pak uložím nové záznamy klienta do obecné kolekce, kterou serializuji a pošlu serveru přes TCP, který ji deserializuje a následně tato data zapisuje do databáze. To je pravděpodobně proces této operace.

       Serializace Používám třídu System.Runtime.Serialization.Iformatter k serializaci generických kolekcí do binárních proudů. Některé serializované kódy jsou následující:

  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írovat kód
Poté odesílejte pomocí protokolu TCP, tato část je vynechána.

Server data částečně přijme, uloží je jako MemoryStream a poté je deserializuje, část kódu je následující:
  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írovat kód
V tuto chvíli spusťte klienta a server pro synchronizaci dat a objeví se následující chybová zpráva:
Chybové chování: diagrams = (Seznam)formater. Deserializovat (memstream);
Doslova: narazil jsem na konec potoka dřív, než byla konverze dokončena.
2. ŘešeníPo vyhledání na Googlu někdo odpověděl na následující možnosti chyb:
1. Typy serializace a deserializace se liší, což lze zde vyloučit;
2. Během serializace není žádný buffer, který by vymazal proud, a metoda Flush() se nepoužívá, což lze zde také vyloučit.
3. Velikost bufferu přijímací procesu před deserializací nemusí být dostatečná, myslím, že by s tím neměl být problém, deserializace probíhá až po akvizičním proudu, neměla by mít nic společného s velikostí bufferu, osobní názor, nezkoušel jsem to;
4. Přidat před deserializacíStrem. Pozice=0。 (Stream je stream, který má být deserializován, ve skutečnosti memstream)
Po testování by čtvrtý test mohl fungovat pro můj program. Proč se to tedy děje, po jednom kroku ladění sledujte memstream. Hodnota Postionu se mění a zjistí se, že pokaždé, když je provedena zápisová operace, hodnota ukazuje na konec, což vysvětluje, proč program takovou chybu hlásí. Ale co nechápu, je, proč funkce deserializace (Deserializovat) místo toho, abych deserializoval celý stream automaticky, začínal jsem tam, kde je pozice?





Předchozí:Řetězec[3]: vlastnost Velikost má neplatnou velikost 0.
Další:vs2010 connection server vss2005 časová chyba, problém je znázorněn na obrázku, žádejte boha o pomoc
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com