2011-11-16 8 views
36

Durante la serializzazione possiamo usare sia il flusso di memoria che il flusso di file.differenza tra flusso di memoria e filestream

Qual è la differenza fondamentale tra questi due? Cosa significa flusso di memoria?

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

risposta

52

Stream è una rappresentazione di byte. Entrambe queste classi derivano dalla classe Stream che è astratta per definizione.

Come suggerisce il nome, un FileStream legge e scrive su un file mentre un MemoryStream legge e scrive nella memoria. Quindi si riferisce a dove è archiviato il flusso.

Ora dipende da come si prevede di utilizzare entrambi. Ad esempio: supponiamo che vogliate leggere i dati binari dal database, andreste dentro per un MemoryStream. Tuttavia, se si desidera leggere un file sul proprio sistema, si dovrebbe procedere per un FileStream.

Un rapido vantaggio di un MemoryStream è che non è necessario creare buffer e file temporanei in un'applicazione.

+5

poiché l'oggetto è già in memoria, perché dobbiamo allocare un flusso di memoria per la serilizzazione? – Raghav55

+0

Poiché il flusso di memoria manipola l'oggetto come una sequenza di byte, non come "significato" del programma logico. – Tudor

+0

@tudor: dal momento che sono novizio a .net, puoi spiegarlo in breif a riguardo? – Raghav55

6

Nella forma più semplice, un MemoryStream scrive i dati in memoria, mentre un FileStream scrive dati in un file.

In genere, utilizzo un MemoryStream se ho bisogno di un flusso, ma non voglio che nulla colpisca il disco, e io uso un FileStream durante la scrittura di un file su disco.

5

Mentre un flusso di file viene letto da un file, è possibile utilizzare un flusso di memoria per leggere i dati mappati nella memoria interna del computer (RAM). Stai praticamente leggendo/scrivendo flussi di byte dalla memoria.

+0

quale è uno migliore quando serilazing i grandi dati? Se i dati di serilize sono grandi e la memoria disponibile è piccola. Cosa succederà in questo caso quando usiamo lo streaming di memoria? – Raghav55

+1

Se i dati superano la memoria disponibile, alla fine inizierà la pagina sul disco. Ciò è negativo perché le prestazioni dell'intero sistema si degradano. In questo caso è meglio solo lo streaming su un file. – Tudor

2

Un flusso di memoria gestisce i dati tramite un buffer di memoria. Un filestream si occupa di file su disco.

2

Avendo un'esperienza amara in materia, ecco cosa ho scoperto. se è necessaria una prestazione, è necessario copiare il contenuto di un filestream in un memorandum. Ho dovuto elaborare il contenuto di 144 file, 528kbytes ciascuno e presentare il risultato all'utente. Ci sono voluti 250 secondi aprox. (!!!!). Quando ho copiato il contenuto di ciascun filestream in un memorandtream, (metodo CopyTo) senza modificare nulla, il tempo è sceso a circa 32 secondi. Si noti che ogni volta che si copia un flusso su un altro, il flusso viene aggiunto alla fine del flusso di destinazione, quindi potrebbe essere necessario "riavvolgerlo" prima di copiarlo. Spero che sia d'aiuto.

+7

Esperienza amara?!? Beh, ovviamente manipolare i file nella RAM sarà più veloce della manipolazione dei file sul disco. Cosa ti aspettavi? ;-) – tomfanning

0

La serializzazione degli oggetti in memoria non è quasi affatto utile, secondo me. È necessario serializzare un oggetto quando si desidera salvarlo su disco. In genere, la serializzazione viene eseguita dall'oggetto (che è in memoria) al disco mentre la deserializzazione viene eseguita dall'oggetto serializzato salvato (sul disco) all'oggetto (in memoria).

Quindi, la maggior parte delle volte, si desidera serializzare su disco, quindi si utilizza un Filestream per la serializzazione.