IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Windows Discussion :

Question de base sur la sérialisation


Sujet :

Développement Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut Question de base sur la sérialisation
    Salut !


    Je suis occupé à élaborer un p'tit programme (pour une utilisation perso) où je vais devoir stocker des données. Jusqu'alors, dans mes progs, je me servais de SQL (tel qu'enseigné aux cours)... mais c'est vrai que c'est un peu lourd à la longue...
    Je me suis alors demandé si ça n'aurait pas été plus simple de passer par un fichier XML. Bref, depuis tout à l'heure, je me suis mis à l'XML et ça n'a pas l'air trop ardu !

    Néanmoins, j'ai une question :

    - Comment fait-on lorsque l'on doit par exemple modifier une donnée par-ci ou lire une autre donnée par-là ? Faut-il chaque fois désérialiser/resérialiser tout l'ensemble du fichier ou y'a des possibilités de parcourir le fichier et de faire des opérations localement ?


    Merci d'avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Citation Envoyé par Mike888 Voir le message
    - Comment fait-on lorsque l'on doit par exemple modifier une donnée par-ci ou lire une autre donnée par-là ? Faut-il chaque fois désérialiser/resérialiser tout l'ensemble du fichier ou y'a des possibilités de parcourir le fichier et de faire des opérations localement ?
    Il va falloir désérialiser et resélialiser le fichier complet.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Ah.... Bon ben je crois que je vais retourner vers mon bon vieux SQL...

    Merci pour ton avis !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Quelqu'un m'a parlé hier de JSON pour sérialiser; vous en pensez quoi de ce format ?

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    binaire json ou xml dans tous les cas tu devras réécrire tout le fichier à chaque fois
    mais ce n'est pas un problème en soit, si tu as quelques centaines de ko ou quelques Mo de données c'est parfois dommage de sortir l'artillerie lourde (après il y a sqlite avant sql server sinon ^^)
    l'avantage aussi c'est que pour modifier le schéma tu modifies ta classe qui stocke les infos et la sérialisation s'adapte

    concernant le choix du type de sérialisation il y a des comparatifs sur le net, il me semble que binaire est le plus performant et le moins gourmand en place, mais est moins interopérable, et il garde les références ce qui peut être piégeux
    json est à la mode, ca prend moins de place que l'xml pour beaucoup d'instance (et plus pour une seule)

    après si c'est pour peu de données les perfs et la place ne sont pas à prendre en compte
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    460
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 460
    Points : 112
    Points
    112
    Par défaut
    Merci pour ta réponse, Pol !

    Mais j'ai quand même une question...
    Vous dites tous les 2 qu'il faut dé-sérialiser puis re-sérialiser tout le bazar à chaque fois ! Ok, mais comment vous faites pour avoir accès à tout moment à toutes les infos nécessaires pour la réécriture du fichier ?

    J'admets que c'est une question newbie !

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    quand je me sers de la sérialisation c'est pour des petits projets
    je fais donc une classe dans laquelle je mets toutes les propriétés que j'ai besoin de sauvegarder, y compris des propriétés qui sont des classes ou des collections (ou les 2)
    je code un singleton (pour n'avoir qu'une instance)
    en static (shared en vb) je fais la méthode qui récupère l'instance, quand elle vaut null (nothing en vb) (variable private static donc) et que le fichier existe je désérialise (3 ou 4 lignes de code) et je return l'instance désérialisé, s'il n'existe pas je return un new de la classe, avec donc les valeurs par défauts

    ensuite j'y accède par LaClasse.GetInstance.TellePropriété depuis toute l'appli

    ensuite selon le cas soit je fais une méthode static Save qui enregistre le singleton dans le fichier sur le disque (3 ou 4 lignes là aussi pour la sérialisation)

    ou alors dans chaque propriété j'appelle la méthode Save que je mets alors en privée, ce qui fait que l'enregistrement est automatique dès que je change quelque chose
    pour les collections, il faut utiliser des ObservableCollection et s'abonner à l'event CollectionChanged pour être averti et pouvoir save auto, et pour les sous classes il faut un mécanisme de parentée, avec un event ou un appel à une méthode
    ceci rend donc le code un peu compliqué (en vb avec le withevents ca doit faire moins de code qu'en c#)

    avec save le code est plus simple, et si l'appli le permet on met juste un bouton "Sauvegarder les paramètres" (s'il n'y a donc que des paramètres et pas de sauvegarde d'états ou de données)

    il n'y a donc qu'une désérialisation pendant toute l'exécution, mais potentiellement plus sérialisations
    et je ne m'embête même pas à sérialiser en asynchrone, c'est très rapide pour quelques données

    attention toutefois à la désérialisation qui ne passe en général pas par le constructeur, ni les initialisations inline des variables de classes

    autre suggestion pour les paranos, sérialiser et désérialiser sur 3 fichiers différents pour être (plus) sûr de ne rien perdre en cas de problème de disque dur, car parfois un octet foireux au milieu et on perd tout la sauvegarde (en xml ou json ca peut se réparer à la main parfois, vu que c'est lisible par un humain, mais pas en binaire je pense)
    avec le mécanisme de vérification et de triple désérialisation/sérialisation alors nécessaire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 13
    Dernier message: 10/10/2007, 10h09
  2. [Débutant] Questions de base sur java
    Par JajaY dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 18h51
  3. Question de base sur l'utilisation de la fonction date()
    Par deaven dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/12/2005, 15h33
  4. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  5. [Débutant] Question de base sur le BDE et les SGBD
    Par Invité dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2005, 08h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo