2009-12-07 7 views
3

Je cherchais à faire une sérialisation binaire dans un fichier et protobuf-net me semble être une alternative très performante. Je suis un peu coincé à commencer cependant. Comme je veux découpler la définition des classes de la sérialisation réelle, je ne suis pas l'aide d'attributs mais qui choisissent d'aller avec .proto fichiers, j'ai la structure de l'objet vers le bas (je pense)Sérialisation d'une liste d'objets en utilisant Protobuf-net

message Post { 

    required uint64 id = 1; 

    required int32 userid = 2; 

    required string status= 3; 

    required datetime created = 4; 

    optional string source= 5; 

} 

(est datetime valide ou devrais-je utiliser ticks comme int64?)

mais je suis bloqué sur la façon d'utiliser protogen puis sérialiser un IEnumerable de Post dans un fichier et le relire. Toute aide serait appréciée

Une autre question connexe, est-il des meilleures pratiques pour la détection des fichiers binaires corrompus, comme si l'ordinateur est arrêté lors de la sérialisation

+0

Salut Mattias, Il n'y a pas de critique ici, mais je suis curieux de savoir pourquoi vous poseriez la question ici plutôt que sur le forum des tampons de protocole assez actif: http://groups.google.com/group/protobuf?pli=1 ? – BillW

+5

@BillW - c'est bien, sûrement? C'est une question de programmation, et l'auteur est assez actif ici, je crois ... –

Répondre

2

Re DateTime ... ce ne une norme prototype; J'ai ajouté un BCL.DateTime (ou similaire) à ma propre bibliothèque, ce qui est destiné à correspondre à la sérialisation interne que protobuf-net utilise pour DateTime, mais je suis assez certain que je n'ai pas (encore) mis à jour le générateur de code pour détecter cela comme un cas particulier. Il serait assez facile d'ajouter si vous voulez que j'essaie ... Si vous voulez une portabilité maximale, une approche de type «ticks» pourrait être pragmatique. Faites-moi savoir ...

Re sérialisation dans un fichier - si cela doit être à peu près le même que l'exemple Getting Started, mais notez que protobuf-net veut travailler avec des données qu'il peut reconstruire; justeIEnumerable<T> pourrait causer des problèmes - IList<T> devrait être bien, cependant (il sera par défaut à List<T> comme un type concret lors de la reconstruction).

Corruption de Re - peut-être utiliser SerializeWithLengthPrefix - il peut alors détecter des problèmes même à une frontière de message (où ils sont autrement indétectables comme EOF). Ceci (comme son nom l'indique) écrit la longueur en premier, donc il sait si les données sont suffisantes (via DeserializeWithLengthPrefix). Vous pouvez également réserver les [n] octets de votre fichier pour un hachage/somme de contrôle. Ecrivez cet espace vide, puis les données, calculez le hash/total de contrôle et écrasez le début. Vérifier pendant la désérialisation. Beaucoup plus de travail.

+0

Bonjour, merci pour la réponse. Ce que je me demandais était sur la déclaration de fichier .proto (plutôt que des attributs) pour une liste de poste, puis comment utiliser protogen et la classe générée ... havent vu un exemple de cela Hmm, peut-être que je pourrais mettre un mannequin Post avec une certaine valeur dernière dans le fichier toujours, et si ce n'est pas là revenir à la dernière sauvegarde – Homde