Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 18725|Antwoord: 0

[Bron] Een vraag over serialisatie en deserialisatie

[Link kopiëren]
Geplaatst op 27-10-2015 19:07:26 | | | |
Gisteren, toen ik database-synchronisatietests deed, gebruikte ik wat serialisatie- en deserialisatietechnologie. Ik abstraheer de velden van een tabel tot een entiteitsklasse DiagramInfo, sla vervolgens de nieuwe records van de client op in een generieke collectie, serialiseer deze generieke collectie vervolgens en stuur deze via TCP naar de server, die het deserialiseert, en schrijf deze data vervolgens naar de database. Dit is waarschijnlijk het proces van deze operatie.

       Serialisatie Ik gebruik de klasse System.Runtime.Serialization.Iformatter om generieke collecties te serialiseren in binaire stromen. Een deel van de geserialiseerde code is als volgt:

  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.         }
Code kopiëren
Stuur dan via het TCP-protocol, dit deel wordt weggelaten.

De server ontvangt de data gedeeltelijk, slaat deze op als een MemoryStream en deserialiseert deze vervolgens; een deel van de code is als volgt:
  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();
Code kopiëren
Op dit moment voer je de client en server uit om de data te synchroniseren, en verschijnt het volgende foutbericht:
Foutgedrag: diagrammen = (Lijst)formatier. Deserialize(memstream);
Letterlijk: kwam het einde van de stream tegen voordat de conversie voltooid was.
2. OplossingNa een Google-zoekopdracht gaf iemand de volgende foutmogelijkheden op:
1. De typen serialisatie en deserialisatie zijn verschillend, wat hier kan worden uitgesloten;
2. Er is geen buffer om de stroom te wissen tijdens serialisatie, en de Flush()-methode wordt niet gebruikt, wat hier ook kan worden uitgesloten.
3. De buffergrootte van het ontvangende proces vóór deserialisatie is misschien niet voldoende, ik denk dat daar geen probleem mee zou moeten zijn, deserialisatie wordt uitgevoerd na de acquisitiestroom, het zou niets te maken moeten hebben met de grootte van de buffer, persoonlijke mening, ik heb het niet geprobeerd;
4. Toevoegen vóór deserialisatieStrem. Positie=0。 (Stream is de stream die gedeserialiseerd moet worden, eigenlijk memstream)
Na het testen kan de vierde voor mijn programma werken. Dus waarom gebeurt dit, na één stap van debuggen, observeer de memstream. De waarde van Postion verandert, en het blijkt dat elke keer dat een schrijfoperatie wordt uitgevoerd, de waarde naar het einde wijst, wat verklaart waarom het programma zo'n fout rapporteert. Maar wat ik niet begrijp is waarom de deserialisatiefunctie (Deserialiseren) in plaats van standaard de hele stream te deserialiseren, beginnend vanaf waar de positie is?





Vorig:String[3]: de eigenschap Size heeft een ongeldige grootte van 0.
Volgend:vs2010 verbinding server vss2005 tijdfout, het probleem is zoals in de figuur getoond, vraag om de hulp van de god
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com