2009-05-03 3 views
6

J'ai un seul fichier et j'ai besoin de sérialiser plusieurs objets de la même classe quand un nouvel objet est créé. Je ne peux pas les stocker dans des tableaux car j'ai besoin de les sérialiser l'instance qu'un objet est créé. Aidez-moi, s'il vous plaît.J'ai un fichier unique et besoin de sérialiser plusieurs objets au hasard. Comment puis-je en C#?

+1

Que voulez-vous dire par hasard? –

+0

Je pense que vous devez clarifier votre anglais. –

+0

Enregistrez-vous les objets dans ce "fichier unique" et récupérez-les à nouveau? Quand vous dites que vous voulez "sérialiser" les objets dès qu'ils sont créés, voulez-vous dire que vous voulez les sauvegarder dans ce seul fichier? – DOK

Répondre

0

Voir la réponse here.

En bref, juste sérialiser tout dans le même flux de fichiers, puis désérialiser. dotNet connaîtrait la taille de chaque objet

7

Quel mécanisme de sérialisation utilisez-vous? XmlSerializer peut être un problème à cause du nœud racine et des choses comme les déclarations d'espace de noms, ce qui est un peu difficile à obtenir - plus ce n'est pas génial pour les désérialisations partielles. BinaryFormatter est très fragile pour commencer - je ne le recommande pas dans la plupart des cas. Une option peut être protobuf-net; Il s'agit d'un sérialiseur binaire (utilisant le format «tampons de protocole» de Google - efficace, portable et tolérant à la version). Vous pouvez sérialiser plusieurs objets dans un flux avec Serializer.SerializeWithLengthPrefix. Pour désérialiser les mêmes éléments, Serializer.DeserializeItems renvoie un IEnumerable<T> des articles désérialisés - ou vous pouvez facilement faire TryDeserializeWithLengthPrefix public (il est actuellement privé, mais la source est disponible).

Il suffit d'écrire chaque objet dans un fichier après l'avoir créé - travail terminé.

Si vous voulez un exemple, veuillez dire - bien que l'unité teste here donne un aperçu.

Il serait essentiellement quelque chose comme (non testé):

using(Stream s = File.Create(path)) 
{ 
    Serializer.SerializeWithLengthPrefix(s, command1, PrefixStyle.Base128, 0); 
    ... your code etc 
    Serializer.SerializeWithLengthPrefix(s, commandN, PrefixStyle.Base128, 0); 
} 
... 
using(Stream s = File.OpenRead(path)) { 
    foreach(Command command in 
      Serializer.DeserializeItems<Command>(s, PrefixStyle.Base128, 0)) 
    { 
     ... do something with command 
    } 
} 
+0

Je sais que je suis en retard pour la fête, mais ça ne vous dérange pas d'élaborer * BinaryFormatter est très fragile pour commencer - je ne le recommande pas dans la plupart des cas. * Pourquoi est-il fragile? Pourquoi vous ne le recommande pas? Cela fait un moment que cette réponse peut-être vous pouvez recommander une autre façon de sérialiser plusieurs objets dans un seul fichier/fichier multiple? –

+1

@mehow sure: BinaryFormatter est très intolérant à la version/refactor: il est très facile de faire en sorte qu'il ne puisse pas désérialiser les fichiers existants en changeant ... eh bien, quoi que ce soit franchement. Il dépend également du framework et de la plate-forme, limitant les options. Il est également inutilement gonflé et inefficace, et a un certain nombre de "getchas". Quant à votre autre question: je suis partial, mais je dirais que protobuf-net répond à toutes ces questions. C'était, après tout, l'objectif de conception :) protobuf-net est parfaitement satisfait de plusieurs objets dans un flux, tant que les méthodes * WithLengthPrefix sont utilisées. –

+0

Merci j'apprécie –

0

Pour chaque objet qui arrive, nous convertirons en une chaîne Base64Encoded et le stocker sous forme d'une ligne dans un fichier texte. Ainsi, dans ce fichier, chaque ligne aura un objet sérialisé par ligne. Pendant la lecture, nous lirons le fichier une ligne à la fois et désérialiserons cette chaîne codée Base64 dans notre objet. Facile .. donc essayons le code.

http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print

Questions connexes