Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 18725|Răspunde: 0

[Sursă] O întrebare despre serializare și deserializare

[Copiază linkul]
Postat pe 27.10.2015 19:07:26 | | | |
Ieri, când am testat sincronizarea bazei de date, am folosit puțină tehnologie de serializare și deserializare. Abstractizez câmpurile unui tabel într-o clasă entitate, DiagramInfo, apoi stochez noile înregistrări ale clientului într-o colecție generică, apoi serializez această colecție generică și o trimit serverului prin TCP, care o deserializează, apoi scriu aceste date în baza de date. Probabil acesta este procesul acestei operațiuni.

       Serializare Folosesc clasa System.Runtime.Serialization.Iformatter pentru a serializa colecții generice în fluxuri binare. O parte din codul serializat este următorul:

  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.         }
Cod de copiere
Apoi trimite folosind protocolul TCP, această parte este omisă.

Serverul primește parțial datele, le salvează ca MemoryStream și apoi le deserializează, o parte din cod fiind următoarea:
  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();
Cod de copiere
În acest moment, rulează clientul și serverul pentru a sincroniza datele, iar următorul mesaj de eroare apare:
Comportament de eroare: diagrame = (Listă)formatator. Deserializare (memstream);
La propriu: am dat peste capătul pârâului înainte ca conversia să fie completă.
2. SoluțieDupă o căutare pe Google, cineva a răspuns la următoarele posibilități de eroare:
1. Tipurile de serializare și deserializare sunt diferite, care pot fi excluse aici;
2. Nu există niciun buffer pentru a curăța fluxul în timpul serializării, iar metoda Flush() nu este folosită, care poate fi exclusă și aici.
3. Dimensiunea buffer-ului procesului de recepție înainte de deserializare poate să nu fie suficientă, cred că nu ar trebui să existe nicio problemă cu asta, deserializarea se face după fluxul de achiziție, nu ar trebui să aibă legătură cu dimensiunea buffer-ului, opinie personală, nu am încercat;
4. Adaugă înainte de deserializareStrem. Poziție=0。 (Stream este fluxul care trebuie deserializat, de fapt memstream)
După testare, al patrulea ar putea funcționa pentru programul meu. Deci, de ce se întâmplă asta? După un singur pas de depanare, observă fluxul mem. Valoarea poziției se schimbă și se constată că de fiecare dată când se efectuează o operație de scriere, valoarea indică spre final, ceea ce explică de ce programul raportează o astfel de eroare. Dar ceea ce nu înțeleg este de ce funcția de deserializare (Deserializează) în loc să deserializezi întregul flux implicit, începând de unde este Poziționul?





Precedent:String[3]: proprietatea Size are o dimensiune invalidă de 0.
Următor:vs2010 server de conexiune vss2005 Eroare de timp, problema este așa cum se arată în figură, cere ajutorul zeului
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com