2011-11-16 15 views
36

Podczas serializacji możemy użyć strumienia pamięci lub strumienia pliku.Różnica między strumieniem pamięci a strumieniem filaru

Jaka jest podstawowa różnica między tymi dwoma? Co oznacza strumień pamięci?

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(); 
     } 
    } 
} 

Odpowiedz

52

Strumień jest reprezentacją bajtów. Obie te klasy wywodzą się z klasy Stream, która z definicji jest abstrakcyjna.

Jak sama nazwa wskazuje, obiekt FileStream odczytuje i zapisuje do pliku, podczas gdy MemoryStream odczytuje i zapisuje w pamięci. Dotyczy to miejsca, w którym przechowywany jest strumień.

Teraz zależy od tego, w jaki sposób zamierzasz korzystać z obu tych funkcji. Na przykład: Załóżmy, że chcesz odczytywać dane binarne z bazy danych, aby przejść do obiektu MemoryStream. Jednak jeśli chcesz przeczytać plik w systemie, możesz przejść do FileStream.

Jedną z zalet systemu MemoryStream jest to, że nie ma potrzeby tworzenia tymczasowych buforów i plików w aplikacji.

+5

odkąd obiekt jest już w pamięci, dlaczego mamy przydzielić strumień pamięci do serwilizacji? – Raghav55

+0

Ponieważ strumień pamięci manipuluje obiektem jako ciągiem bajtów, a nie jego programem logicznym "znaczenie". – Tudor

+0

@ Tudor: ponieważ jestem początkującym do .net, możesz wyjaśnić w tym zakresie? – Raghav55

6

W najprostszej postaci, MemoryStream zapisuje dane w pamięci, natomiast FileStream zapisuje dane do pliku.

Zwykle używam obiektu MemoryStream, jeśli potrzebuję strumienia, ale nie chcę, aby coś uderzyło w dysk, a podczas zapisywania pliku na dysku używam obiektu FileStream.

5

Podczas gdy strumień plików czyta z pliku, strumień pamięci może być używany do odczytu danych mapowanych w pamięci wewnętrznej komputera (RAM). Zasadniczo czytasz/zapisujesz strumienie bajtów z pamięci.

+0

co jest lepsze, gdy serwikuje się duże dane? Jeśli dane do przeszukania są duże, a dostępna pamięć jest niewielka. Co stanie się w takim przypadku, gdy używamy strumienia pamięci? – Raghav55

+1

Jeśli twoje dane przekroczą dostępną pamięć, to w końcu zaczną wracać na dysk. Jest to złe, ponieważ cała wydajność systemu ulegnie pogorszeniu. W takim przypadku lepiej po prostu przesłać strumień do pliku. – Tudor

2

Strumień pamięci obsługuje dane za pośrednictwem bufora pamięci. Strumień pliku dotyczy plików na dysku.

2

Po gorzkich doświadczeniach na ten temat, oto co odkryłem. jeśli wymagana jest wydajność, powinieneś skopiować zawartość strumienia plików do strumienia danych. Musiałem przetworzyć zawartość 144 plików po 528 kilobajtach i przedstawić wynik użytkownikowi. Zajęło to około 250 sekund. (!!!!). Kiedy tylko skopiowałem zawartość każdego strumienia plików do memorystreamu, (metoda CopyTo) bez zmiany czegokolwiek, czas spadł do około 32 sekund. Zauważ, że za każdym razem, gdy kopiujesz jeden strumień do drugiego, strumień jest dołączany na końcu strumienia docelowego, więc przed skopiowaniem możesz go "przewinąć". Mam nadzieję, że to pomoże.

+7

Gorzkie doświadczenie?!? Oczywiście manipulowanie plikami w pamięci RAM będzie szybsze niż manipulowanie plikami na dysku. Czego oczekiwałeś? ;-) – tomfanning

0

Szeregowanie obiektów w pamięci praktycznie nie jest przydatne, moim zdaniem. Musisz serializować obiekt, gdy chcesz go zapisać na dysku. Zazwyczaj serializacja jest wykonywana z obiektu (który znajduje się w pamięci) na dysk, podczas gdy przekształcanie odbywa się z zapisanego serializowanego obiektu (na dysku) do obiektu (w pamięci).

Tak więc, większość czasu chcesz przekształcić do postaci szeregowej na dysk, dlatego używasz Filestream do serializacji.

Powiązane problemy