Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 18725|Svare: 0

[Kilde] Et spørsmål om serialisering og deserialisering

[Kopier lenke]
Publisert på 27.10.2015 19:07:26 | | | |
I går, da jeg gjorde testing av databasesynkronisering, brukte jeg litt serialiserings- og deserialiseringsteknologi. Jeg abstraherer feltene i en tabell til en entitetsklasse DiagramInfo, lagrer deretter de nye postene til klienten i en generisk samling, og serialiserer deretter denne generiske samlingen og sender den til serveren via TCP, som deserialiserer den, og skriver deretter disse dataene til databasen. Dette er sannsynligvis prosessen i denne operasjonen.

       Serialisering Jeg bruker klassen System.Runtime.Serialization.Iformatter for å serialisere generiske samlinger i binære strømmer. Noe av den serialiserte koden er som følger:

  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.         }
Kopier koden
Send deretter med TCP-protokollen, denne delen utelates.

Serveren mottar delvis dataene, lagrer dem som en MemoryStream, og deserialiserer dem deretter, en del av koden er som følger:
  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();
Kopier koden
På dette tidspunktet kjører klient og server for å synkronisere dataene, og følgende feilmelding vises:
Feiloppførsel: diagrammer = (Liste)formater. Deserialize(memstream);
Bokstavelig talt: møtte enden av strømmen før konverteringen var fullført.
2. LøsningEtter et Google-søk svarte noen på følgende feilmuligheter:
1. Typene serialisering og deserialisering er forskjellige, noe som kan utelukkes her;
2. Det finnes ingen buffer for å rydde strømmen under serialisering, og Flush()-metoden brukes ikke, noe som også kan utelukkes her.
3. Bufferstørrelsen på mottaksprosessen før deserialisering kan være utilstrekkelig, jeg mener det ikke bør være noe problem med dette, deserialisering utføres etter anskaffelsesstrømmen, det bør ikke ha noe med bufferens størrelse å gjøre, personlig mening, jeg har ikke prøvd det;
4. Legg til før deserialiseringStrem. Posisjon=0。 (Stream er streamen som skal deserialiseres, egentlig memstream)
Etter testing kan det fjerde fungere for mitt program. Så hvorfor skjer dette? Etter ett enkelt steg med feilsøking, observer memstreamen. Postions verdi endres, og det viser seg at hver gang en skriveoperasjon utføres, peker verdien mot slutten, noe som forklarer hvorfor programmet rapporterer en slik feil. Men det jeg ikke forstår, er hvorfor deserialiseringsfunksjonen (Deserialize) i stedet for å deserialisere hele strømmen som standard, med utgangspunkt der Positon er?





Foregående:Streng[3]: Størrelse-egenskapen har en ugyldig størrelse på 0.
Neste:VS2010 tilkoblingsserver vss2005 tidsfeil, problemet er som vist i figuren, be om Guds hjelp
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com