Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 18725|Risposta: 0

[Fonte] Una domanda sulla serializzazione e la deserializzazione

[Copiato link]
Pubblicato su 27/10/2015 19:07:26 | | | |
Ieri, mentre facevo test di sincronizzazione del database, ho usato un po' di tecnologia di serializzazione e deserializzazione. Astracciono i campi di una tabella in una classe di entità, DiagramInfo, poi memorizzo i nuovi record del client in una collezione generica, poi serializzo questa collezione generica e la invio al server tramite TCP, che la deserializza, e infine scrivo questi dati nel database. Probabilmente questo è il processo di questa operazione.

       Serializzazione Uso la classe System.Runtime.Serialization.Iformatter per serializzare collezioni generiche in flussi binari. Alcuni del codice serializzato sono i seguenti:

  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.         }
Copia codice
Poi invia usando il protocollo TCP, questa parte viene omessa.

Il server riceve parzialmente i dati, li salva come MemoryStream e poi li deserializza; parte del codice è la seguente:
  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();
Copia codice
In questo momento, esegui client e server per sincronizzare i dati e compare il seguente messaggio di errore:
Comportamento dell'errore: diagrammi = (Lista)formattatore. Deserializzare (memstream);
Letteralmente: ho incontrato la fine del flusso prima che la conversione fosse completata.
2. SoluzioneDopo una ricerca su Google, qualcuno ha risposto alle seguenti possibilità di errore:
1. I tipi di serializzazione e deerializzazione sono diversi, che possono essere esclusi qui;
2. Non esiste alcun buffer per liberare il flusso durante la serializzazione, e il metodo Flush() non viene utilizzato, che può essere escluso qui.
3. La dimensione del buffer del processo ricevente prima della deserilizzazione potrebbe non essere sufficiente, penso che non ci debba essere alcun problema in questo, la deserilizzazione avviene dopo il flusso di acquisizione, non dovrebbe avere nulla a che fare con la dimensione del buffer, opinione personale, non l'ho provato;
4. Aggiungere prima della deserializzazioneTrem. Posizione=0。 (Stream è lo stream da deserializzare, in realtà memstream)
Dopo i test, il quarto potrebbe funzionare per il mio programma. Allora perché succede questo? Dopo un singolo passaggio di debug, osserva il memstream. Il valore di Position cambia, e si scopre che ogni volta che viene eseguita un'operazione di scrittura, il valore punta alla fine, il che spiega perché il programma segnala tale errore. Ma quello che non capisco è perché la funzione di deserializzazione (Deserializza) invece di deserializzare l'intero flusso di default, partendo da dove si trova il Posizionamento?





Precedente:Stringa[3]: la proprietà Size ha una dimensione invalida pari a 0.
Prossimo:VS2010 Connection Server VSS2005 Errore di tempo, il problema è come mostrato nella figura, chiedi aiuto al dio
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com