2011-09-02 14 views
5

Sto provando a scrivere un flusso sulla ram anziché su un file. Ho provato a fare questo:Scrive su uno stream come se fosse un file, ma scrive realmente su un oggetto

Stream stream = new MemoryStream(); 
BinaryFormatter bFormatter = new BinaryFormatter(); 
bFormatter.Serialize(stream, objectToSerialize); 
stream.Close(); 
return stream; 

Ma quando guardo il flusso dopo aver presumibilmente scritta ad esso si sta dicendo "Lunghezza = 'stream.Length' ha generato un'eccezione di tipo 'System.ObjectDisposedException'"

risposta

3

Stai chiamando stream.Close(), che è esattamente lo stesso di chiamare Dispose() sullo streaming.

Basta rimuovere quella riga di codice e si dovrebbe andare bene. Fondamentalmente, è necessario lasciare aperto il MemoryStream quando viene restituito.

Su una nota diversa, a seconda di ciò che si sta per fare, si potrebbe anche voler ripristinare la posizione del flusso. Ho il sospetto che si vorrà:

Stream stream = new MemoryStream(); 
BinaryFormatter bFormatter = new BinaryFormatter(); 
bFormatter.Serialize(stream, objectToSerialize); 
stream.Position = 0; 
return stream; 

questo funziona lo stesso il tuo codice, ma non lo fa Dispose() il flusso (dal momento che non è più chiamando stream.Close() è), e ripristina anche alla posizione di partenza, che è spesso richiesto se vuoi leggere l'oggetto/i dati di nuovo.

+0

Grazie che ha fatto il trucco. –

0

Non chiamare stream.Close (o IDisposable.Dispose()) finché non hai finito con lo streaming.

probabilmente è necessario impostare la posizione flusso torna all'inizio stream.Position = 0;

Assicurarsi che non smaltire il flusso quando hai finito. L'affermazione using è tua amica qui.

0

È perché si stream.Close(); l'oggetto.

0

Si sta ottenendo l'eccezione perché si chiama Close(). Da MSDN: Stream Class

Chiude il flusso di corrente e rilascia tutte le risorse (come ad esempio le prese e handle di file) associato al flusso di corrente.

Dovresti riuscire a rimuovere semplicemente stream.Close();.

5

Non chiudere il flusso prima di ottenere i dati, e non vi ritornano il flusso, ma il contenuto del torrente:

using (Stream stream = new MemoryStream()) { 
    BinaryFormatter bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(stream, objectToSerialize); 
    return stream.ToArray(); 
} 
Problemi correlati