2011-09-02 11 views
5

Estoy intentando escribir una secuencia en el ram en lugar de en un archivo. He intentado hacer esto:Escribir en una secuencia como si fuera un archivo, pero realmente escribir en un objeto

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

Pero cuando miro a la corriente después de que supuestamente he escrito a lo que está diciendo "Longitud = 'stream.Length' produjo una excepción de tipo 'System.ObjectDisposedException'"

Respuesta

3

Llamas al stream.Close(), que es exactamente lo mismo que llamar al Dispose() en la transmisión.

Simplemente elimine esa línea de código, y debería estar bien. Básicamente, debe dejar el MemoryStream abierto cuando se devuelve.

En una nota diferente, dependiendo de lo que va a hacer, es posible que también desee restablecer la posición de la secuencia. Sospecho que usted quiere:

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

Esto funciona igual que su código, pero no lo hace Dispose() la corriente (puesto que ya llamar stream.Close() no lo es), y también se restablece a la posición inicial, que a menudo se requiere si quieres volver a leer el objeto/datos.

+0

gracias que hizo el truco. –

0

No llame a stream.Close (o IDisposable.Dispose()) hasta que haya terminado con la secuencia.

es probable que tenga que ajustar la posición de la corriente de vuelta a empezar stream.Position = 0;

Asegúrese de que debe ser eliminado de la corriente cuando haya terminado. La declaración using es tu amiga aquí.

0

Es porque stream.Close(); el objeto.

0

Estás recibiendo la excepción porque llamas al Close(). De MSDN: Stream Class

Cierra la secuencia actual y libera los recursos (tales como enchufes y los identificadores de archivo) asociado con la corriente actual.

Debería poder eliminar simplemente stream.Close();.

5

No cierre la corriente antes de obtener los datos, y no vuelve la corriente, pero el contenido de la corriente:

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