|
Biblioteca de clase MFC ofer? suport pentru implementarea persisten?ei obiectelor prin intermediul serializ?rii. Serializarea reprezint? procesul de transformare a unei structuri de date într-un flux liniar de bi?i, iar procesul invers, de recuperare a structurii de date dintr-un flux de bi?i poart? numele de deserializare.
Serializarea este folosit? pentru:
- stocarea unei structuri de date într-o memorie persistent? (ex. stocarea sub forma de fi?ier pe suport magnetic);
- transferul unei structuri de date (ex. prin conexiunile unei re?ele).
Pentru fiecare clas? ce se dore?te s? implementeze obiecte persistente se va defini o func?ie membru, numit? Serialize(), care este responsabil? de serializarea/deserializarea variabilelor membru ale acesteia. Implementarea func?iei Serialize() pentru o clas? anume implic? determinarea variabilelor membru ale clasei care vor fi salvate astfel încât starea unui obiect s? poat? fi recuperat? în întregime. În unele cazuri variabilele membru care trebuie stocate reprezint? valori ale unor tipuri simple sau tablouri de mici dimensiuni. Problema devine mai dificil? în momentul în care variabilele membru care se salveaz? reprezint? instan?e ale altor clase sau chiar pointeri c?tre astfel de instan?e. Din fericire, MFC permite efectuarea salv?rii într-un mod simplu ?i uniform pentru toate cazurile amintite mai sus.
În general, o clas? care suport? serializarea este derivat? din clasa CObject a bibliotecii de clase MFC (dac? sunt serializate referin?e spre obiectele clasei acest lucru este obligatoriu). La nivelul clasei COject este definit? o func?ie membru virtual? numit? Serialize() având urm?toarea signatur?:
virtual void Serialize(CArchive& ar);
În MFC scrierea ?i citirea de date într-un ?i dintr-un fi?ier se realizeaz? prin intermediul unui obiect care poart? numele de arhiv? ?i care este o instan?? a clasei CArchive (figura 1). Fiecare func?ie Serialize() implementat? într-o clas? are ca ?i parametru o referin?? c?tre o instan?? a unei astfel de arhive.
Figura 1. Clasa CArchive
Fiecare arhiv? con?ine o referin?? c?tre un fi?ier ?i, pe m?sur? ce obiectele sunt incluse în ea, va avea grij? s? ata?eze fi?ierului ?irul de bi?i corespunz?tor. Într-o aplica?ie contruit? pe baza arhitecturii document-view, clasa document va con?ine func?ia Serialize() care va fi apelat? ori de câte ori este necesar? salvarea sau înc?rcarea într-un fi?ier (de exemplu, ca r?spuns la comenzile ‘Open’ sau ‘Save’ din meniul ‘File’). Implementarea corect? a acestei func?ii pentru a realiza stocarea ?i recuperarea tuturor obiectelor con?inute în document depinde strict de programator.
Pentru a în?elege mai u?or modul de implementare a persisten?ei s? lu?m un exemplu în care avem o clas? care reprezint? angaja?ii unei companii. Pentru a reduce din complexitate (dar f?r? a restrânge generalitate), vom considera ca atribute ale unui angajat doar numele ?i vârsta sa, l?sând de asemenea la o parte func?iile membru din interfa?a clasei:
|