différence entre les flux de mémoire et filestream
Lors de la sérialisation, nous pouvons utiliser soit des flux de mémoire ou de flux de fichier.
Quelle est la différence fondamentale entre ces deux? Ce n'flux de mémoire signifie?
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();
}
}
}
Vous devez vous connecter pour publier un commentaire.
Flux est une représentation d'octets. Ces deux classes dérivent de la classe Stream qui est, par définition, abstrait.
Comme son nom l'indique, un FileStream lit et écrit dans un fichier alors qu'un MemoryStream les lectures et les écritures de la mémoire. Si elle se rapporte à l'endroit où le flux de données est stockée.
Maintenant, il dépend de la façon dont vous prévoyez d'utiliser à la fois de ces. Pour exemple: supposons que vous voulez lire des données binaires à partir de la base de données, vous allez faire un MemoryStream. Toutefois si vous voulez lire un fichier sur votre système, vous devrez aller pour un FileStream.
Rapide, l'avantage d'un MemoryStream est qu'il n'y a pas besoin de créer des tampons temporaires et fichiers dans une application.
FileStream
etMemoryStream
sont tous deux résident dans la mémoire.Autres réponses ici sont grands, mais j'ai pensé que celui qui prend un très haut niveau, regardez ce but vapeurs servir peut être utile. Il y a un peu de simplification en cours dans l'explication ci-dessous, mais j'espère que cela ait l'idée à travers:
Qu'est ce qu'un flux?
Un flux est effectivement le flux de données entre deux lieux, c'est le tuyau plutôt que sur le contenu de cette pipe.
Une mauvaise analogie pour commencer
Imaginez une usine de dessalement d'eau (quelque chose qui prend l'eau de mer, supprime le sel et sorties de l'eau potable à l'eau de réseau):
L'usine de dessalement ne pouvez pas supprimer le sel de l'ensemble de la mer à la fois (et ce ne serait, nous le voulons... où serait le poisson d'eau salée vivre?), donc, au lieu de cela, nous avons:
SeaStream
qui suce une quantité d'eau dans la plante.SeaStream
est connecté à laDesalinationStream
pour enlever le selDesalinationStream
est connecté à laDrinkingWaterNetworkStream
à la sortie de la maintenant sans sel de l'eau pour l'alimentation en eau potable.OK, alors qu'est-ce que vous avez à faire avec des ordinateurs?
Déplacer les gros fichiers, tout à la fois peut être problématique
Fréquemment dans le calcul, nous voulons déplacer des données entre les deux endroits, par exemple à partir d'un disque dur externe à un champ binaire dans une base de données (pour reprendre l'exemple donné dans une autre réponse). Nous pouvons le faire que par la copie de toutes les données de ce fichier à partir d'Un emplacement dans la mémoire de l'ordinateur et à partir de là, à l'Endroit B, mais si le fichier est volumineux ou la source ou la destination sont potentiellement peu fiables puis en déplaçant l'ensemble du dossier à la fois peut être impossible ou déraisonnable.
Par exemple, disons que nous voulons pour déplacer un gros fichier sur une clé USB à un champ dans une base de données. On pourrait utiliser un Système.IO.Fichier' objet à récupérer que tout le fichier dans la mémoire de l'ordinateur, puis utiliser une connexion de base de données pour transmettre ce fichier sur la base de données.
Mais, qui est potentiellement problématique, que si le fichier est plus grand que l'ordinateur RAM disponible? Maintenant, le fichier risque d'être mis en cache sur le disque dur, qui est lent, et il pourrait même ralentissent l'ordinateur trop.
De même, si la source de données n'est pas fiable, par exemple, la copie d'un fichier à partir d'un lecteur réseau avec une lente et feuilletée connexion WiFi? Essayez de copier un gros fichier en une seule fois peut être exaspérant parce que vous obtenez la moitié du fichier, puis la connexion tombe et vous devez tout recommencer, tout cela pour éventuellement échouer à nouveau.
Il peut être préférable de diviser le fichier et le déplacer d'une pièce à la fois
Donc, plutôt que de prendre un ensemble de fichiers à la fois, il serait mieux pour récupérer le fichier d'une pièce à la fois et de passer chaque morceau sur la destination à la fois. C'est ce qu'un
Stream
fait et c'est là que les deux différents types de flux que vous avez mentionnées dans:FileStream
pour récupérer des données à partir d'un fichier d'une pièce à la foisMemoryStream
point de terminaison, nous pouvons écrire une pièce à la fois.Même si le fichier n'était pas trop grande pour être tenue dans la RAM, sans flux, nous étions encore en train de faire un numéro ou d'opérations de lecture/écriture que nous n'avons pas besoin de. Les étapes que nous nous sommes réalisation ont été:
Flux de nous permettre de nous sur le plan conceptuel d'en finir avec le moyen deux étapes, au lieu de faire glisser l'ensemble du fichier dans la mémoire de l'ordinateur à la fois, nous prenons la sortie de l'opération pour récupérer les données et les tuyaux que tout de suite à l'opération pour transmettre les données vers la base de données.
D'autres avantages de flux de
La séparation de la récupération de données à partir de l'écriture des données, comme cela nous permet également d'effectuer des actions entre la récupération des données et de les transmettre. Par exemple, nous pourrions ajouter une étape de chiffrement, ou l'on pouvait écrire les données entrantes à plus d'un type de flux de sortie (par exemple à un FileStream et NetworkStream).
Flux de nous permettre d'écrire du code où l'on peut reprendre l'opération si le transfert échoue en cours de route. En gardant la trace du nombre de pièces que nous avons déménagé, si le transfert échoue (par exemple, si la connexion réseau gouttes), nous pouvons redémarrer le Flux à partir du moment où nous avons reçu le dernier morceau (c'est le
offset
dans leBeginRead
méthode).Dans la forme la plus simple, un MemoryStream écrit des données dans la mémoire, tandis qu'un FileStream écrit des données dans un fichier.
Généralement, j'utilise un MemoryStream si j'ai besoin d'un ruisseau, mais je ne veux rien de frapper le disque, et j'utilise un FileStream lors de l'écriture d'un fichier sur le disque.
Tandis qu'un flux de fichier lit un fichier, un flux de mémoire peut être utilisé pour lire les données mappées dans l'ordinateur de la mémoire interne (RAM). Vous êtes essentiellement de lecture/écriture de flux d'octets de la mémoire.
Ayant une expérience amère, sur le sujet, voici ce que j'ai découvert. si la performance est nécessaire, vous devez copier le contenu d'un filestream pour un memorystream. J'ai eu à traiter le contenu de 144 fichiers, 528kbytes chacun et d'en présenter les résultats à l'utilisateur. Il a fallu 250 secondes environ. (!!!!). Quand je l'ai juste copié le contenu de chaque filestream pour un memorystream, (méthode CopyTo) sans rien changer à tous, le temps est tombé à environ 32 secondes. Notez que chaque fois que vous copiez un flux à un autre, le flux est ajouté à la fin de la destination des flux, de sorte que vous pouvez avoir besoin de "revenir en arrière" avant de copier. Espérons que cela aide.
Un flux de mémoire gère les données par l'intermédiaire d'une mémoire tampon. Un filestream traite les fichiers sur le disque.
fprintf(memory_buf, "hello")
) < - - transfer - - > mémoire tampon de données de processus", tandis que pour le fichier de la base de flux, le modèle "données mensonges/produit/vient de disque < - - transfer - - > mémoire tampon de données de processus" ?La sérialisation des objets en mémoire n'est guère utile, à mon avis. Vous avez besoin de sérialiser un objet lorsque vous souhaitez l'enregistrer sur le disque. Généralement, la sérialisation est fait à partir de l'objet(qui est en mémoire) sur le disque alors que la désérialisation est fait à partir de l'sauvé objet sérialisé(sur le disque) à l'objet(dans la mémoire).
Donc, la plupart du temps, vous souhaitez sérialiser sur le disque, donc vous utilisez un Filestream pour la sérialisation.