1. Serialize ¶
MFCμ document λ κ°λ¨ν ν΄λμ€κ° μλλ€. μ΄ ν΄λμ€λ μΌλ°μ μΌλ‘ λ€μν κ°μ²΄λ€μ ν¬ν¨νλ€.
νλ‘κ·Έλ¨μ μ§λ©΄μ μ΄λ° document λ₯Ό νμΌλ‘ μ μ₯ν΄μΌνλ€. λ¨μν κΈ°λ³Ένμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λΆλ¬λ€μ΄κΈ°λ μ½μ§λ§, κ°μ²΄λ¨μλ‘ μ΄λ₯Ό ννλ κ²μ λλ¨ν μ΄λ €μ΄ μΌμ΄λ€.
μ΄λ₯Ό μν΄μ MFCλ μ§λ ¬ν(Serialization)μ΄λΌλ κΈ°λ₯μ μ 곡νλ€. μ΄ κΈ°λ₯μ ν΅ν΄μ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λ€μ μ½λλ° λ€μ΄λ λ Έλ ₯μ μ΅μν ν μ μλ€.
νλ‘κ·Έλ¨μ μ§λ©΄μ μ΄λ° document λ₯Ό νμΌλ‘ μ μ₯ν΄μΌνλ€. λ¨μν κΈ°λ³Ένμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λΆλ¬λ€μ΄κΈ°λ μ½μ§λ§, κ°μ²΄λ¨μλ‘ μ΄λ₯Ό ννλ κ²μ λλ¨ν μ΄λ €μ΄ μΌμ΄λ€.
μ΄λ₯Ό μν΄μ MFCλ μ§λ ¬ν(Serialization)μ΄λΌλ κΈ°λ₯μ μ 곡νλ€. μ΄ κΈ°λ₯μ ν΅ν΄μ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λ€μ μ½λλ° λ€μ΄λ λ Έλ ₯μ μ΅μν ν μ μλ€.
2. inner Document Class ¶
.h
~cpp class CXXXDoc : public CDocument { protected: // create from serialization only CPainterDoc(); DECLARE_DYNCREATE(CPainterDoc) // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CPainterDoc) public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); //}}AFX_VIRTUAL }.cpp
~cpp IMPLEMENT_DYNCREATE(CXXXDoc, CDocument) void CXXXDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } }DECLARE_DYNCREATE
CXXXDoc ν΄λμ€μ κ°μ²΄κ° μ리μΌν μ
λ ₯κ³Όμ λμ μμ© νλ‘κ·Έλ¨μ ν΅ν΄ λμ μΌλ‘ μμ±λ μ μλλ‘ νλ€. IMPLEMENT_DYNCREATEμ λ§€μΉ. μ΄ λ§€ν¬λ‘λ CObject μμ νμλ ν΄λμ€μλ§ μ μ©λλ€. λ°λΌμ μ§λ ¬νλ₯Ό νλ €λ©΄ ν΄λμ€λ μ§μ μ μ΄λ κ°μ μ μ΄λ CObjectμ Derived Class μ¬μΌνλ€.
void Serialize(CArchive& ar)
μ§λ ¬νλ₯Ό νλ €λ λͺ¨λ κ°μ²΄μλ μ΄ λ©μλλ₯Ό ꡬνν΄μ£Όμ΄μΌ νλ€. (has-a κ΄κ³μ μλ κ²λ)
κΈ°λ³Έ μμ±μ
μ§λ ¬ν κΈ°λ₯μ΄ μλνλλ° μμ΄μ νμν κ². μ΄λ νμΌλ‘ λΆν° κ°μ²΄λ₯Ό μ½μλ κ°μ²΄λ₯Ό ν©μ±νλ νλ μμμ μν΄ μ¬μ©λλ€.
IMPLEMENT_DYNCREATE
κΈ°λ³Έ ν΄λμ€λ‘λΆν° μμλ λ©€λ²λ€μ ν¬ν¨νμ¬ CXXXDocκ°μ²΄κ° μ μ νκ² λμ μΌλ‘ μμ±λ μ μλλ‘ νλλ° νμν κ²μ΄λ€.
void CXXXDoc::Serialize(CArchive& ar)
ν΄λμ€μ λ°μ΄ν° λ©€λ²λ€μ μ§λ ¬ννλ μν
IsStoring() μ ν΅ν΄μ μ μ₯μΈμ§ λ‘λμΈμ§λ₯Ό νλ³νλ€.
ꡬνμ νλ‘κ·Έλλ¨Έμ μν΄μ μ΄λ£¨μ΄μ§λ€.
IsStoring() μ ν΅ν΄μ μ μ₯μΈμ§ λ‘λμΈμ§λ₯Ό νλ³νλ€.
ꡬνμ νλ‘κ·Έλλ¨Έμ μν΄μ μ΄λ£¨μ΄μ§λ€.
3. CArchive Class ¶
MFCκΈ°λ°μ μ€νΈλ¦Όμ μ 곡νλ ν΄λμ€μ΄λ€. κ°μ²΄λ€μ νμΌμ μΆλ ₯νκ±°λ, κ·Έκ²μ μ
λ ₯ μ€νΈλ¦½μΌλ‘μ 볡ꡬνλ μ€ν°λ¦¬λ°μ λν λ©μ»€λμ¦μ μ 곡νλ€.
ν΄λμ€ μμλ CFile κ°μ²΄κ° μμΌλ©°, CArchiveλ μ€μ λ‘ μ΄ ν΄λμ€λ₯Ό ν΅ν΄μ νμΌ μ μΆλ ₯μ μ λ΄μν¨λ€.
CArchiveλ κ°μ²΄ λ°μ΄ν°λ₯Ό ꡬμ±νλ λ‘μ§μ μ²λ¦¬νλ μΌμ μ λ΄νλ€.
κΈ°λ³Έ λ°μ΄ν° νμ μ²κΈ°νκΈ° μν΄μ <<, >> μ°μ°μκ° μ€λ²λΌμ΄λ©λμ΄μλ€.
(float, double, BYTE, int, LONG, WORD, DWORD, CObject*, CString, SIZE, CSize, POINT, CPoint, RECT, CRect, CTime, CTimeSpan μ΄ μ€λ²λΌμ΄λ© λμ΄μλ€.)
ν΄λμ€ μμλ CFile κ°μ²΄κ° μμΌλ©°, CArchiveλ μ€μ λ‘ μ΄ ν΄λμ€λ₯Ό ν΅ν΄μ νμΌ μ μΆλ ₯μ μ λ΄μν¨λ€.
CArchiveλ κ°μ²΄ λ°μ΄ν°λ₯Ό ꡬμ±νλ λ‘μ§μ μ²λ¦¬νλ μΌμ μ λ΄νλ€.
κΈ°λ³Έ λ°μ΄ν° νμ μ²κΈ°νκΈ° μν΄μ <<, >> μ°μ°μκ° μ€λ²λΌμ΄λ©λμ΄μλ€.
(float, double, BYTE, int, LONG, WORD, DWORD, CObject*, CString, SIZE, CSize, POINT, CPoint, RECT, CRect, CTime, CTimeSpan μ΄ μ€λ²λΌμ΄λ© λμ΄μλ€.)
4. ν΄λμ€μ μ§λ ¬ν κΈ°λ₯ μΆκ° ¶
μ°Έκ³ ) MFC/CObject
DECLARE_SERIAL()λ§€ν¬λ‘λ₯Ό ν΅ν΄μ μ§λ ¬ν κΈ°λ₯μ μΆκ°κ° κ°λ₯νλ€. λ΄λΆμ μΌλ‘ new, delete λ₯Ό μ¬μ©νλλ°, λ§€λͺ¨λ¦¬ λ¦μ μΆμ νλ μ½λκ° λ€μ΄κ°λ―λ‘ νΉλ³ν νλ‘κ·Έλλ¨Έκ° μ κ²½μ¨μΌ νλ λΆλΆμ μλ€.
λ§€ν¬λ‘λ ν΄λμ€μ μ΄λ¦μ μΈμλ‘ λ°λλ€. λ°λΌμ λ§μ½ CExample μ μ§λ ¬ν κΈ°λ₯μ μΆκ°νλ€λ©΄ CExample μ μ μλΆμ λ΄λΆ μ΄λ κ³³μμλ
ꡬν νμΌμ λ£μ΄μΌν IMPLEMENT_SERIAL()λ 3κ°μ§μ μΈμλ₯Ό μ·¨νλ€. 첫λ²μ¬λ μ΄λ¦, λλ²μ¬λ λ°λ‘ μ λ¨κ³μ κΈ°λ³Έ ν΄λμ€, νλ‘κ·Έλ¨μ λν μ€ν€λ§ λ²νΈ(scheme number), νΉμ λ²μ μ λνλ΄λ λΆνΈ μλ 32λΉνΈ μ μλ₯Ό μΈμλ‘ λ°λλ€.
3λ²μ§Έ μΈμλ λ€λ₯Έ λ²μ μ νλ‘κ·Έλ¨μΌλ‘ μ½μμ λ λ°μνλ λ¬Έμ λ₯Ό λ§μμ€λ€.
λ§μ½ CExampleDerived κ° CExampleμ μμ ν΄λμ€μΈλ° μ΄ ν΄λμ€λ₯Ό μ§λ ¬ν νκΈ°μν΄μλ λͺ¨λ μ€κ° λ¨κ³μ ν΄λμ€ μμ€μμ μ§λ ¬νκ° κ΅¬νλμ΄μΌ νλ€.
DECLARE_SERIAL()λ§€ν¬λ‘λ₯Ό ν΅ν΄μ μ§λ ¬ν κΈ°λ₯μ μΆκ°κ° κ°λ₯νλ€. λ΄λΆμ μΌλ‘ new, delete λ₯Ό μ¬μ©νλλ°, λ§€λͺ¨λ¦¬ λ¦μ μΆμ νλ μ½λκ° λ€μ΄κ°λ―λ‘ νΉλ³ν νλ‘κ·Έλλ¨Έκ° μ κ²½μ¨μΌ νλ λΆλΆμ μλ€.
~cpp DECLARE_SERIAL{CExample) //λ§€ν¬λ‘ μ΄λ―λ‘ ;λ₯Ό λΆμ¬μ μλλ€.λ₯Ό μΆκ°νλ©΄ λλ€. (Class Wizard κ° κ΄λ¦¬νλ λΆλΆμ μ½μ νλ κ²μ μ μΈ γ ‘.γ ‘;;)
3λ²μ§Έ μΈμλ λ€λ₯Έ λ²μ μ νλ‘κ·Έλ¨μΌλ‘ μ½μμ λ λ°μνλ λ¬Έμ λ₯Ό λ§μμ€λ€.
~cpp IMPLEMENT_SERIAL(CExample, CObject, 1)μ΄νμ ν΄λμ€ μ μλ₯Ό μμ νλ€λ©΄ μ€ν€λ§ λ²νΈλ₯Ό λ°κΎΈμ΄μΌ νλ€. (λ€λ₯Έ λ²μ μ νμΌμ μ½μΌλ € νλ©΄ μμΈλ₯Ό λ°μμν¨λ€.
5. λμ λ°©μ ¶
μ§λ ¬νλ CDocument κ°μ²΄μμ Serialize() μ΄λ²€νΈκ° λ°μνκ² λλ©΄ λ΄λΆμ μ§μ λ λͺ¨λ λ©€λ² λ³μλ€μκ² Serialize λ©μμ§λ₯Ό 보λ΄μ κ²°κ΅μ κΈ°λ³Ένμ λ°μ΄ν°λ₯Ό <<. >>μ κ°μ κΈ° μ§μ λ μ€λ²λΌμ΄λ© ν¨μλ₯Ό ν΅ν΄μ μ²λ¦¬νλ λ°©μμΌλ‘ μ΄λ£¨μ΄μ Έμλ€.
6. μ€μ μ ꡬνμ? ¶
- ν΄λμ€κ° CObject μ μμ ν΄λμ€ μΈμ§ νμΈνλΌ.
- DECLARE_SERIAL() λ§€ν¬λ‘λ₯Ό μΆκ°νλΌ. λ§μ½ λ°λ‘ μμμ ν΄λμ€κ° CObject κ° μλλΌλ©΄ λ°λ‘ μμμ ν΄λμ€μ μΆκ°νλΌ)
- Serialize() ν¨μλ₯Ό ν΄λμ€μ λ©€λ² ν¨μλ‘ μ μΈνλΌ.
- IMPLEMENT_SERIAL() λ§€ν¬λ‘λ₯Ό ν΄λμ€ κ΅¬νμ ν¬ν¨νκ³ μλ νμΌμ μΆκ°νλΌ.
- ν΄λμ€μλν Serialize()λ₯Ό ꡬννλΌ.