Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 18725|Svar: 0

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

[Kopier link]
Opslået på 27/10/2015 19.07.26 | | | |
I går, da jeg lavede databasesynkroniseringstest, brugte jeg lidt serialiserings- og deserialiseringsteknologi. Jeg abstraherer felterne i en tabel til en entitetsklasse DiagramInfo, gemmer derefter klientens nye poster i en generisk samling, serialiserer derefter denne generiske samling og sender den til serveren via TCP, som deserialiserer den, og skriver så disse data til databasen. Dette er sandsynligvis processen for denne operation.

       Serialisering Jeg bruger klassen System.Runtime.Serialization.Iformatter til at serialisere generiske samlinger i binære strømme. Noget af den serialiserede kode 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 kode
Send derefter med TCP-protokollen, denne del udelades.

Serveren modtager delvist dataene, gemmer dem som en MemoryStream og deserialiserer dem derefter; en del af 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 kode
Kør på dette tidspunkt klient og server for at synkronisere dataene, og følgende fejlmeddelelse vises:
Fejladfærd: diagrammer = (Liste)formater. Deserialize(memstream);
Bogstaveligt talt: mødte enden af strømmen, før konverteringen var fuldført.
2. LøsningEfter en Google-søgning svarede nogen på følgende fejlmuligheder:
1. Typerne af serialisering og deserialisering er forskellige, hvilket kan udelukkes her;
2. Der er ingen buffer til at rydde strømmen under serialisering, og Flush()-metoden bruges ikke, hvilket også kan udelukkes her.
3. Bufferstørrelsen på modtagerprocessen før deserialisering er måske ikke tilstrækkelig, jeg mener, der ikke burde være noget problem med dette, deserialisering udføres efter erhvervelsesstrømmen, det bør ikke have noget at gøre med bufferens størrelse, personlig mening, jeg har ikke prøvet det;
4. Tilføj før deserialiseringStrem. Position=0。 (Stream er den stream, der skal deserialiseres, faktisk memstream)
Efter testning kan den fjerde måske fungere for mit program. Så hvorfor sker det her? Efter et enkelt trin med fejlfinding skal du observere memstreamen. Postions værdi ændres, og det viser sig, at hver gang en skriveoperation udføres, peger værdien mod slutningen, hvilket forklarer, hvorfor programmet rapporterer en sådan fejl. Men det, jeg ikke forstår, er, hvorfor deserialiseringsfunktionen (Deserialize) i stedet for at deserialisere hele strømmen som standard, startende der, hvor Positon er?





Tidligere:Streng[3]: Størrelsesegenskaben har en ugyldig størrelse på 0.
Næste:vs2010 forbindelsesserver vss2005 tidsfejl, problemet er som vist i figuren, bed om gudens hjælp
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com