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