U E D R , A S I H C RSS

MFC/Serialize

1. Serialize

MFC의 document λŠ” κ°„λ‹¨ν•œ ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” 일반적으둜 λ‹€μ–‘ν•œ 객체듀을 ν¬ν•¨ν•œλ‹€.
ν”„λ‘œκ·Έλž¨μ„ μ§œλ©΄μ„œ 이런 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() 을 ν†΅ν•΄μ„œ μ €μž₯인지 λ‘œλ“œμΈμ§€λΌ νŒλ³„ν•œλ‹€.
κ΅¬ν˜„μ€ ν”„λ‘œκ·Έλž˜λ¨Έμ— μ˜ν•΄μ„œ 이루어진닀.

3. CArchive Class

MFC기반의 μŠ€νŠΈλ¦Όμ„ μ œκ³΅ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. 객체듀을 νŒŒμΌμ— 좜λ ₯ν•˜κ±°λ‚˜, 그것을 μž…λ ₯ μŠ€νŠΈλ¦½μœΌλ‘œμ„œ λ³΅κ΅¬ν•˜λŠ” μŠ€ν‹°λ¦¬λ°μ— λŒ€ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•œλ‹€.
클래슀 μ•ˆμ—λŠ” 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 의 μ •μ˜λΆ€μ˜ λ‚΄λΆ€ μ–΄λŠ κ³³μ—μ„œλ‚˜
~cpp  DECLARE_SERIAL{CExample)		//맀크둜 이λ€λ‘œ ;λΌ λΆ™μ—¬μ„  μ•ˆλœλ‹€.
λΌ μΆ”κ°€ν•˜λ©΄ λœλ‹€. (Class Wizard κ°€ κ΄€λ¦¬ν•˜λŠ” 뢀뢄에 μ‚½μž…ν•˜λŠ” 것은 μ œμ™Έ γ…‘.γ…‘;;)

κ΅¬ν˜„ νŒŒμΌμ— λ„£μ–΄μ•Όν•  IMPLEMENT_SERIAL()λŠ” 3κ°€μ§€μ˜ μΈμˆ˜λΌ μ·¨ν•œλ‹€. μ²«λ²ˆμž¬λŠ” 이름, λ‘λ²ˆμž¬λŠ” λ°”λ‘œ μœ— λ‹¨κ³„μ˜ κΈ°λ³Έ 클래슀, ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ μŠ€ν‚€λ§ˆ 번호(scheme number), ν˜Ήμ€ 버전을 λ‚˜νƒ€λ‚΄λŠ” λΆ€ν˜Έ μ—†λŠ” 32λΉ„νŠΈ μ •μˆ˜λΌ μΈμžλ‘œ λ°›λŠ”λ‹€.
3번째 μΈμžλŠ” λ‹€λ₯Έ λ²„μ „μ˜ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ½μ—ˆμ„ λ•Œ λ°œμƒν•˜λŠ” λ¬Έμ œλΌ λ§‰μ•„μ€λ‹€.
~cpp IMPLEMENT_SERIAL(CExample, CObject, 1)
이후에 클래슀 μ •μ˜λΌ μˆ˜μ •ν•œλ‹€λ©΄ μŠ€ν‚€λ§ˆ λ²ˆν˜ΈλΌ λ°”κΎΈμ–΄μ•Ό ν•œλ‹€. (λ‹€λ₯Έ λ²„μ „μ˜ νŒŒμΌμ„ 읽으렀 ν•˜λ©΄ μ˜ˆμ™ΈλΌ λ°œμƒμ‹œν‚¨λ‹€.

λ§Œμ•½ CExampleDerived κ°€ CExample의 μžμ‹ 클래슀인데 이 ν΄λž˜μŠ€λΌ μ§λ ¬ν™” ν•˜κΈ°μœ„ν•΄μ„œλŠ” λͺ¨λ“  쀑간 λ‹¨κ³„μ˜ 클래슀 수μ€μ—μ„œ 직렬화가 κ΅¬ν˜„λ˜μ–΄μ•Ό ν•œλ‹€.

5. λ™μž‘ 방식

μ§λ ¬ν™”λŠ” CDocument κ°μ²΄μ—μ„œ Serialize() μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ²Œ 되면 내뢀에 μ§€μ •λœ λͺ¨λ“  멀버 λ³€μˆ˜λ“€μ—κ²Œ Serialize λ©”μ‹œμ§€λΌ λ³΄λ‚΄μ„œ κ²°κ΅­μ—” κΈ°λ³Έν˜•μ˜ λ°μ΄ν„°λΌ <<. >>와 같은 κΈ° μ§€μ •λœ μ˜€λ²„λΌμ΄λ”© ν•¨μˆ˜λΌ ν†΅ν•΄μ„œ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ΄λ£¨μ–΄μ Έμžˆλ‹€.

6. μ‹€μ œμ˜ κ΅¬ν˜„μ€?

  • ν΄λž˜μŠ€κ°€ CObject 의 μžμ‹ 클래슀 인지 ν™•μΈν•˜λΌ.
  • DECLARE_SERIAL() λ§€ν¬λ‘œλΌ μΆ”κ°€ν•˜λΌ. λ§Œμ•½ λ°”λ‘œ μƒμœ„μ˜ ν΄λž˜μŠ€κ°€ CObject κ°€ μ•„λ‹ˆλΌλ©΄ λ°”λ‘œ μƒμœ„μ˜ ν΄λž˜μŠ€μ— μΆ”κ°€ν•˜λΌ)
  • Serialize() ν•¨μˆ˜λΌ ν΄λž˜μŠ€μ˜ 멀버 ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜λΌ.
  • IMPLEMENT_SERIAL() λ§€ν¬λ‘œλΌ ν΄λž˜μŠ€ κ΅¬ν˜„μ„ ν¬ν•¨ν•˜κ³  μžˆλŠ” νŒŒμΌμ— μΆ”κ°€ν•˜λΌ.
  • ν΄λž˜μŠ€μ—λŒ€ν•œ Serialize()λΌ κ΅¬ν˜„ν•˜λΌ.

7. Thread

Introspection κΈ°λŠ₯이 μžˆλŠ” λ‹€λ₯Έ μ–Έμ–΄λ“€μ—μ„œμ˜ Serialize ν•˜λŠ” λͺ¨μŠ΅μ— λŒ€ν•΄μ„œλŠ” λ°˜λ“œμ‹œ κ΄€μ°°ν•΄λ³Ό ν•„μš”κ°€ 있음.~ --1002

----
MFC
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:42
Processing time 0.0271 sec