2011-11-16 51 views
36

Trong quá trình tuần tự hóa, chúng tôi có thể sử dụng luồng bộ nhớ hoặc luồng tệp.sự khác biệt giữa luồng bộ nhớ và dòng phim

Sự khác biệt cơ bản giữa hai loại này là gì? Luồng bộ nhớ có nghĩa là gì?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.Serialization.Formatters.Binary; 

namespace Serilization 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MemoryStream aStream = new MemoryStream(); 
      BinaryFormatter aBinaryFormat = new BinaryFormatter(); 
      aBinaryFormat.Serialize(aStream, person); 
      aStream.Close(); 
     } 
    } 
} 

Trả lời

52

Luồng là biểu diễn các byte. Cả hai lớp này xuất phát từ lớp Stream, nó trừu tượng theo định nghĩa.

Như tên cho thấy, một FileStream đọc và ghi vào một tệp trong khi MemoryStream đọc và ghi vào bộ nhớ. Vì vậy, nó liên quan đến nơi lưu trữ luồng.

Giờ tùy thuộc vào cách bạn định sử dụng cả hai loại này. Ví dụ: Giả sử bạn muốn đọc dữ liệu nhị phân từ cơ sở dữ liệu, bạn sẽ vào trong một MemoryStream. Tuy nhiên nếu bạn muốn đọc một tập tin trên hệ thống của bạn, bạn sẽ đi vào cho một FileStream.

Một lợi thế nhanh của MemoryStream là không cần phải tạo bộ đệm và tệp tạm thời trong ứng dụng.

+5

vì đối tượng đã có trong bộ nhớ, tại sao chúng ta phân bổ luồng bộ nhớ cho quá trình serilization? – Raghav55

+0

Vì luồng bộ nhớ điều khiển đối tượng dưới dạng chuỗi byte, không phải là chương trình logic của nó "có nghĩa". – Tudor

+0

@tudor: kể từ khi tôi mới làm quen với .net, bạn có thể giải thích về breif về điều này không? – Raghav55

6

Trong biểu mẫu đơn giản nhất, MemoryStream ghi dữ liệu vào bộ nhớ, trong khi FileStream ghi dữ liệu vào tệp.

Thông thường, tôi sử dụng MemoryStream nếu tôi cần một luồng, nhưng tôi không muốn bất cứ thứ gì để nhấn vào đĩa và tôi sử dụng FileStream khi ghi tệp vào đĩa.

5

Khi luồng tệp đọc từ một tệp, luồng bộ nhớ có thể được sử dụng để đọc dữ liệu được ánh xạ trong bộ nhớ trong của máy tính (RAM). Về cơ bản bạn đọc/ghi các luồng byte từ bộ nhớ.

+0

cái nào tốt hơn khi serilazing dữ liệu lớn? Nếu dữ liệu serilize là lớn và bộ nhớ avaiable là nhỏ. Wht sẽ xảy ra trong trường hợp này khi chúng ta sử dụng luồng bộ nhớ? – Raghav55

+1

Nếu dữ liệu của bạn vượt quá bộ nhớ có sẵn, nó sẽ bắt đầu trang vào đĩa cuối cùng. Điều này là xấu bởi vì toàn bộ hiệu suất của hệ thống sẽ bị suy giảm. Trong trường hợp này, tốt hơn là chỉ phát trực tiếp vào một tệp. – Tudor

2

Luồng bộ nhớ xử lý dữ liệu qua bộ đệm trong bộ nhớ. Một luồng phim đề cập đến các tệp trên đĩa.

2

Có trải nghiệm cay đắng về chủ đề, đây là những gì tôi đã phát hiện ra. nếu hiệu suất là bắt buộc, bạn nên sao chép nội dung của một dòng phim vào bộ nhớ. Tôi đã phải xử lý nội dung của 144 tệp, 528kbyte mỗi tệp và trình bày kết quả cho người dùng. Phải mất 250 giây aprox. (!!!!). Khi tôi chỉ sao chép nội dung của mỗi dòng phim vào một bộ nhớ, (phương thức CopyTo) mà không thay đổi gì cả, thời gian đã giảm xuống còn khoảng 32 giây. Lưu ý rằng mỗi lần bạn sao chép một luồng sang luồng khác, luồng được nối vào cuối luồng đích, vì vậy bạn có thể cần phải 'tua lại' luồng trước khi sao chép vào luồng đó. Hy vọng nó giúp.

+7

Trải nghiệm đắng?!? Tất nhiên các thao tác tập tin trong RAM sẽ nhanh hơn thao tác tập tin trên đĩa. Những gì bạn đã mong đợi? ;-) – tomfanning

0

Sắp xếp các đối tượng trong bộ nhớ khó có ích, theo ý kiến ​​của tôi. Bạn cần serialize một đối tượng khi bạn muốn lưu nó trên đĩa. Thông thường, serialization được thực hiện từ đối tượng (trong bộ nhớ) vào đĩa trong khi deserialization được thực hiện từ đối tượng serialized đã lưu (trên đĩa) cho đối tượng (trong bộ nhớ).

Vì vậy, hầu hết các lần, bạn muốn tuần tự hóa vào đĩa, do đó bạn sử dụng một Dòng phim để tuần tự hóa.

Các vấn đề liên quan