2010-07-15 6 views
5

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.

Répondre

1

Essayez de mettre vos objets dans une collection sérialisable (je crois que la liste est sérialisable), puis (de) sérialisation que objet

EDIT en réponse à la clarification: Je viens de réaliser que cette question a la même réponse comme ceci question. Plutôt que d'essayer de réinventer une réponse, je venais de jeter un oeil à la réponse de Mark Gravell, ou this one

+0

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

+0

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

0

Un fichier est une sérialisation, donc je pense envoyer votre flux directement dans un fichier ferait ce que vous semble vouloir. Une explication plus précise de votre situation aiderait à fournir une réponse plus utile. (Je souhaite que je puisse entrer cela comme un «commentaire», mais de quelque façon le bouton de commentaire n'est pas disponible pour moi.)

+0

La sérialisation n'est pas le problème. Le problème est que si je sérialise un objet à la fois (ce que je dois) et que je les ajoute à un flux, je ne peux pas désérialiser le flux résultant, car le flux entier ne représente pas un seul objet. – United

+0

Fondamentalement, normalement, lorsque vous sérialisez un objet dans un fichier, le fichier contiendra cet objet (c'est-à-dire [Object]) afin de désérialiser vous obj. Object = binaryFormatter.Deserialize (fs, MyObjType); Ce que j'ai est un fichier de la forme [Object] [Object] ... [Object] donc je ne peux pas simplement appeler la fonction deserialize sur ce fichier, puisque ce que j'ai fourni au deserializer n'est pas une sérialisation d'un seul objet. – United

+0

Ce à quoi je pensais, c'est d'y mettre des délimiteurs (à condition qu'il existe une combinaison de symboles qu'un sérialiseur ne peut jamais produire). De cette façon, je peux analyser manuellement le fichier en morceaux (représentant un seul objet sérialisé) dans un flux et donner des morceaux à un autre flux, qui à son tour est donné au désérialiseur. – United