Je suis confronté au problème suivant. J'ai besoin de (dé) sérialiser (binaire) un flux d'objets vers un seul fichier sur le disque. La partie de sérialisation n'est pas un problème, il suffit d'ouvrir un flux en mode ajout et d'utiliser la méthode BinaryFormatter Serialize de .Net et vous avez terminé. Le problème avec cette approche est que je ne peux pas simplement donner ce flux à la fonction deserialize de BinaryFormatter, ce qu'il contient n'est pas une seule instance de l'objet que j'ai sérialisé.Binaire (De) Sérialisation d'un flux d'objets à 1 fichier
Une solution commune à ce problème existe-t-elle? Tous les objets sérialisés à un flux donné sont du même type, donc au moins nous n'avons pas besoin de comprendre ce qui doit être désérialisé, c'est donné, mais cela ne semble pas suggérer un moyen de m'en sortir.
Précisions sur la base des réponses: Le nombre d'objets envoyés devrait être grande et il est donc impossible de les tenir tous dans une collection d'emballage (comme rinçage sur le disque, il faudrait pour les charger dans la mémoire -> ajoutez les nouveaux -> vider sur le disque).
- Normalement, lorsque vous sérialiser un seul objet, vous obtenez un fichier qui contient:
[Objet]
- Ce que je suis en train de créer est un fichier qui contient:
[Object] [Object] [Object] [Object] ... [Object]
Et j'ai besoin de désérialiser les instances d'objet individuelles.
Merci d'avance!
Réponse: Depuis la réponse est fait allusion dans ce fil (avec suffisamment de clarté), mais jamais explicitement dit, je pensais que je déclare ici:
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
BinaryFormatter sera désérialiser un objet à la fois comme souhaité :) Vous pouvez mettre en cache la propriété fileStream.Length, car la longueur semble être recalculée chaque fois que vous appelez la propriété, ce qui ralentit les choses. Je n'ai aucune idée pourquoi cela n'a pas fonctionné la première fois que j'ai essayé avant de poster cette question, mais cela fonctionne parfaitement maintenant.
les objets sont diffusés pendant la durée de vie du système et il y en a un très grand nombre attendu , J'ai besoin de tirer la chasse d'eau.En les conservant dans la collection wrapper, je vais devoir les garder tous en mémoire et réécrire le fichier entier chaque fois que je veux rincer sur le disque. – United
la première suggestion ne fonctionne pas, en raison de besoin d'une autre bibliothèque (aka 6 mois + processus d'approbation par le biais juridique, si j'ai de la chance). Le second est intrigant. Pour la deuxième réponse, il semble qu'ils ont la sérialisation normale pour désérialiser la série d'objets d'un fichier sans que ces objets soient dans la collection. Dans mes tests, cela n'a pas fonctionné, donc je suppose que je vais essayer d'approfondir la question + peut-être faire un suivi dans cette question SO. – United