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:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
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:
- do
- {
- bytesRead = stream.Read(responseBuffer, 0, bufferSize);
- memstream.Write(responseBuffer, 0, bytesRead);
- }
- while (bytesRead > 0);
- IFormatter formater = new BinaryFormatter();
- diagrams = (List)formater.Deserialize(memstream);
- stream.Close();
- memstream.Close();
- client.Close();
Copia codiceIn 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?
|