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í:
- 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í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í:
- 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írovat kódV 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?
|