Sérialisation – Base de registres
Transcription
Sérialisation – Base de registres
Génie logiciel Sérialisation – Base de registres SPE4 - ESI 1 Sérialisation : qu’est-ce que c’est ? Les objets sont « persistants » Ils peuvent être enregistrés sur disque quand l’application prend fin, et sont relus lorsqu’elle redémarre Ce processus d’enregistrement et de relecture des documents de l’application est appelé sérialisation Dans la bibliothèque MFC, des classes (CDocument, …) ont une fonction membre appelée Serialize(). Quand cette fonction est appelée, les données membres de l’objet sont soit lues, soit écrites sur le disque dur. 2 Génie logiciel – Sérialisation – Base de registre 1 Sérialisation vs Bases de données La sérialisation ne remplace pas les bases de données Sérialisation Les objets associés au document sont lus séquentiellement dans un unique fichier du disque ou écrits Bases de données Classes spécifiques Microsoft ODBC : Open Data Base Connectivity DAO : Data Access Objects ADO : Active Data Object 3 Processus de sérialisation C*Doc::Serialize(CArchive&) est appelée par l’architecture d’application lorsque les options « File open », « File Save » ou « File Save As » sont appelées. Les fichiers sur disque sont représentés par des objets de la classe CFile. Un objet CArchive bufférise les données pour l’objet CFile, et maintient un indicateur interne qui précise si l’archive est en train d’être écrite ou lue (une seule archive active est associée à un fichier simultanément). Objet Document C*Doc::Serialize() Objet CArchive Objet CFile Si l’application ne fait pas d’E/S directes sur le disque dur, la sérialisation suffit. 4 Génie logiciel – Sérialisation – Base de registre 2 Rendre une classe sérialisable Pour être sérialisable, une classe doit satisfaire aux conditions suivantes : elle doit être dérivée directement ou indirectement de la classe CObject sa déclaration doit contenir l’appel de la macro DECLARE_SERIAL sa définition doit contenir l’appel de la macro IMPLEMENT_SERIAL Les deux macros DECLARE_SERIAL et IMPLEMENT_SERIAL permettent de générer le code nécessaire à la sérialisation des classes dérivées de CObject. Dans le fichier .h, remplacer DECLARE_DYNCREATE(C*Doc) par DECLARE_SERIAL(C*Doc) Dans le fichier .cpp, remplacer IMPLEMENT_DYNCREATE(CClasse, CObject) par IMPLEMENT_SERIAL(CClasse, CObject, 0) 5 Ecrire une méthode Serialize() Pour lire ou écrire dans un fichier les membres d’une classe, il faut lui donner une méthode Serialize(). Le paramètre de la méthode Serialize() redéfinie doit correspondre à celui de CObject::Serialize(CArchive&). Utiliser les opérateurs d’insertion (<<) et d’extraction (>>) pour lire et écrire les données du document. Les fonctions Serialize() de classes dérivées doivent appeler les fonctions Serialize() de leurs classes ancêtres. void CClasse::Serialize(CArchive& ar) { if (ar.IsStoring()) { // Add storing code here ar << ...; } else { // Add loading code here ar >> ...; } } 6 Génie logiciel – Sérialisation – Base de registre 3 Portabilité Si l’on doit employer des types qui dépendent de la taille d’un mot machine, il faut les convertir en l’un des types du tableau ci-contre Les classes qui ne dérivent pas de CObject ont leur propres opérateurs surchargés d’insertion et d’extraction pour CArchive (par exemple CString et CRect) Type Description BYTE 8 bits, non signé WORD 16 bits, non signé LONG 32 bits, signé DWORD 32 bits, non signé float 32 bits double 64 bits int 32 bits, signé Short 16 bits, signé char 8 bits, non signé unsigned 32 bits, non signé 7 Relation entre Fichier Ouvrir et Serialize Liste des fonctions appelées lorsque l’option « File Open » du menu file est sélectionnée. Remarque : la liste des derniers fichiers utilisés est une alternative commode à l’utilisation de l’option « File Open ». C*App::OnFileOpen() CDocument::OnOpenDocument() Sélection et ouverture d'un fichier par l'utilisateur Construction de l'objet CArchive pour lire le fichier Appel de la fonction C*Doc::DeleteContents() C*Doc::Serialize() C*View::OnInitialUpdate() 8 Génie logiciel – Sérialisation – Base de registre 4 Fonction DeleteContents() Document SDI Pour charger un document, il faut supprimer le document courant. Les fonctions CDocument::OnFileNew() et CDocument::OnFileOpen appellent la fonction virtuelle CDocument::DeleteContents(). ⇒ ⇒ Nécessité de redéfinir CDocument::DeleteContents() dans la classe C*Doc dérivée de CDocument. Prévoir de vider le document dans C*Doc::DeleteContents() plutôt que dans le destructeur (on ne place dans le destructeur que le nettoyage des données qui durent toute la vie de l’objet C*Doc). Document MDI Pas de souci, puisqu’un nouvel objet document est construit chaque fois qu’un fichier est lu, et détruit à la fermeture de la fenêtre fille. 9 Relation entre Fichier Enregistrer et Serialize Liste des fonctions appelées lorsque les options Enregistrer ou Enregistrer sous du menu Fichier sont sélectionnées : CDocument::OnFileSave() CDocument::OnFileSaveAs() CDocument::OnSaveDocument() C*Doc::Serialize(CArchive&) 10 Génie logiciel – Sérialisation – Base de registre 5 Indicateur de document modifié Donnée membre protégée CDocument::m_bModified void CDocument::SetModifiedFlag(BOOL = TRUE); BOOL CDocument::IsModified(); Exemple : void C*Doc::OnCalcul() { BeginWaitCursor(); // modification du document SetModifiedFlag(TRUE); UpdateAllViews(NULL); EndWaitCursor(); } 11 Mise à jour du bouton « File Save » Fonction d’interception qui estompe le bouton File Save (disquette) de la barre d’outils lorsque le document n’est pas modifié. La vue contrôle l’état du document en appelant la fonction IsModified(). void CMdiDoc::OnUpdateFileSave(CCmdUI* pCmdUI) { // disable disk toolbar if file is not modified pCmdUI->Enable(IsModified()); } Génie logiciel – Sérialisation – Base de registre 12 6 Enregistrement d’application Stocker des données dans les registres windows (extension, etc…) Méthode C*App::InitInstance() du fichier *.cpp SetRegistryKey(_T("Local Applications")); String Table : \nMdi\nMdi\nMdi Files (*.mdi)\n.mdi\nMdi.Document\nMdi Document "\n" Ressources modèles de document Titre de l'application Racine pour les noms des documents "Mdi\n" Nom du type de document "Mdi\n" "Mdi Files (*.mdi)\n" Description et filtre pour le type de document Extension pour les documents de ce type ".mdi\n" ID du type de fichier dans le registre "Mdi.Document" Description du type de fichier dans le "Mdi Document" registre 13 Classe CFileDialog Classe permettant de construire une boîte de dialogue Ouvrir ou Enregistrer sous. Exemple : CFileDialog dlg (TRUE, "*.txt", "*.txt", OFN_ALLOWMULTISELECT| OFN_OVERWRITEPROMPT,"Fichiers Texte (*.txt)", NULL); if (dlg.DoModal()!=IDOK) return; m_strFileName = dlg.GetPathName(); 14 Génie logiciel – Sérialisation – Base de registre 7 Paramètre du constructeur de CFileDialog bOpenFileDialog Mettre TRUE pour construire une boîte de dialogue Ouvrir ou FALSE pour construire une boîte de dialogue Enregistrer sous . lpszDefExt Extension (Type de fichier) apparaissant par défaut lors de l’ouverture de la boîte de dialogue. Si NULL, aucune extension apparaîtra. lpszFileName Nom du fichier apparaissant par défaut lors de l’ouverture de la boîte de dialogue. Si NULL, aucun nom apparaîtra. dwFlags Combinaison de un ou plusieurs flags permettant de personnaliser la boîte de dialogue. OFN_ALLOWMULTISELECT : Permet une sélection multiple. OFN_OVERWRITEPROMPT : Genère un message si le nom de fichier existe déjà. lpszFilter Permet un filtrage des fichiers affichés dans la boîte de dialogue pParentWnd Pointeur. 15 Glisser déposer (Drag and drop) Activation du Drag and Drop Méthode C*App::InitInstance() du fichier *.cpp m_pMainWnd->DragAcceptFiles(); 16 Génie logiciel – Sérialisation – Base de registre 8 Base de registres Windows C’est un ensemble de fichiers système dans lequel Windows et le applications individuelles peuvent stocker et accéder à des informations permanentes. La base de registre se présente sous la forme d’une sorte de base de données hiérarchique, dans laquelle des données chaînes ou entières sont atteintes à l’aide d’une clé. 17 Dossiers / Clé prédéfinies HKEY_CURRENT_USER Correspond à la racine contenant les informations de configuration de l'utilisateur connecté. Les paramètres utilisateur des dossiers, des couleurs d'écran et du Panneau de configuration sont stockés ici. Ces informations constituent un profil utilisateur. HKEY_USERS Correspond à la racine de tous les profils d'utilisateurs de l'ordinateur. HKEY_CURRENT_USER est une sous-clé de HKEY_USERS. HKEY_LOCAL_MACHINE Contient les informations de configuration spécifiques à l'ordinateur (pour tous les utilisateurs). HKEY_CLASSES_ROOT Sous-clé de HKEY_LOCAL_MACHINE\Software. Les informations stockées ici garantissent l'ouverture du programme voulu lorsque vous ouvrez un fichier depuis l'Explorateur Windows. HKEY_CURRENT_CONFIG Contient des informations sur le profil matériel utilisé par l'ordinateur local au démarrage. 18 Génie logiciel – Sérialisation – Base de registre 9 Base de registres Windows L’assistant d’application MFC génère un appel à CWinApp::SetRegistryKey dans la fonction InitInstance de votre application : SetRegistryKey(_T("Applications locales générées par AppWizard")); Le paramètre chaîne définit le haut de la hiérarchie. 19 Base de registres Windows Pour définir les deux niveaux inférieurs (nom d’en-tête et nom d’entrée), il faut utiliser les fonctions suivantes : Pour récupérer une valeur dans la base de registre WriteProfileInt WriteProfileString GetProfileInt GetProfileString Toutes les fonctions reçoivent comme paramètre un nom d’en-tête, un nom d’entrée et la valeur. 20 Génie logiciel – Sérialisation – Base de registre 10 Base de registres Windows Ecrire le code à ajouter à la fonction InitInstance pour obtenir dans la base de registre la structure le résultat suivant: 21 Base de registres Windows 22 Génie logiciel – Sérialisation – Base de registre 11