2011-09-02 31 views
5

Tôi đang cố gắng viết một luồng vào ram thay vì một tập tin. Tôi đã cố gắng làm điều này:Ghi vào một luồng như thể nó là một tập tin, nhưng thực sự ghi vào một đối tượng

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

Nhưng khi tôi nhìn vào dòng sau khi tôi đã được cho là ghi vào nó nó đang nói "Chiều dài = 'stream.Length' ném một ngoại lệ của loại 'System.ObjectDisposedException"

Trả lời

3

Bạn đang gọi số stream.Close(), chính xác giống như gọi số Dispose() trên luồng.

Chỉ cần xóa dòng mã đó và bạn sẽ ổn. Về cơ bản, bạn cần phải mở MemoryStream khi nó được trả về.

Trên ghi chú khác, tùy thuộc vào những gì bạn định làm, bạn cũng có thể muốn đặt lại vị trí của luồng. Tôi nghi ngờ bạn sẽ muốn:

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

này hoạt động giống như mã của bạn, nhưng không Dispose() dòng (vì nó không có gì gọi stream.Close() dài hơn), và cũng có thể reset nó vào vị trí bắt đầu, mà thường được yêu cầu nếu bạn muốn đọc lại đối tượng/dữ liệu.

+0

Cảm ơn bạn rằng đã làm các trick. –

0

Không gọi stream.Đóng (hoặc IDisposable.Dispose()) cho đến khi bạn hoàn tất luồng.

Bạn có thể cần phải thiết lập vị trí dòng trở lại để bắt đầu stream.Position = 0;

Hãy chắc chắn rằng bạn không vứt bỏ dòng khi bạn đã hoàn tất. Tuyên bố using là bạn của bạn ở đây.

0

Đó là vì bạn stream.Close(); đối tượng.

0

Bạn nhận được ngoại lệ vì bạn gọi Close(). Từ MSDN: Stream Class

Đóng dòng hiện tại và phiên bản bất kỳ tài nguyên (như ổ cắm và tập tin xử lý) gắn liền với dòng hiện tại.

Bạn có thể chỉ cần xóa stream.Close();.

5

Đừng đóng dòng trước khi nhận được dữ liệu, và không trả lại dòng nhưng nội dung của các dòng:

using (Stream stream = new MemoryStream()) { 
    BinaryFormatter bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(stream, objectToSerialize); 
    return stream.ToArray(); 
} 
Các vấn đề liên quan