특정 객체 상태를 저장하거나, 네트워크 전송 따위를 지원하기 위해서는 객체의 직렬화가 필요하다.

내가 정리하고자 하는 내용은, c#에서 사용할 수 있는 직렬화 방법 중 크게 두 가지의 종류가 있는데

이를 정리하기 위함이다.


 

참조 : http://stackoverflow.com/questions/1154198/what-are-the-differences-between-the-xmlserializer-and-binaryformatter

http://www.csharpstar.com/serialize-and-deserialize-data-csharp/


 BinaryFomatter  : 객체를 직렬화 하는데, 아웃풋이 바이너리 형태이다. (즉 사람눈으로 바로 읽을 순 없다..ㅠㅠ)



 - Serialization을 할 때, 어셈블리 정보와 타입정보를 포함하기 때문에,

   Deserialization 할 때, 각 객체의 타입을 알고 있어 올바른 객체타입으로 객체를

   만들 수 있다. 또한 생성된 객체들을 하나의 인터페이스로 캐스팅할 수 있다.


 - 성능이 빠르다.

 - .Net에 종속적이다. (Type까지 저장하는거보니, .Net에서만 쓰이는 객체일 수 도있으니까?! 자세히 저장하는 대신, .Net에 종속적인 단점이 있다.)



xmlSerializer : Xml 형태로 아웃풋이 나온다. (xml형태이므로 쉽게 눈으로 읽을 수 있다!)


<Name> Kim sung ji </Name>

<Age> ... </Age> ...

....


- Serialization 할 때, 하나의 스키마로 직렬화 하며,

   오직 public fields와 그의 값들만 기억하며,

   위에서 기억한 것들의 타입 정보는 저장하지 않는다.


- BinaryFomatter 보다 성능은 떨어진다.

 


등등..





Serialization Comparison

'C,C++,C#' 카테고리의 다른 글

C, C# 이벤트, 이벤트 핸들러  (0) 2015.10.08
블로그 이미지

kuku_dass

,

Click이라는 Event가 있다면, Event는 Eventhandler를 가져야 한다.

그 Event가 발생했을 때, 어떻게 처리될지 정의를 Handler가 가지고 있으니까.


결국


Click이라는 Event가 있다면, 우리는 Click += new EventHandler...

와 같이, Click이라는 Event에 그에 맞는 handler를 넣어 줄 것이다.


--------------------------------------------------------------------


EventHandler 란? - Event를 어떻게 다룰지 정의한 함수(메소드)를 가리키는 함수포인터.


(C언어) : 함수 포인터를 만들어주되, 함수 포인터 이름 자체를 하나의 Type으로

사용할 수 있도록 typedef 키워드를 함께 사용 한다.


typedef void (*EventHandler)(void)


EventHandler handler; // EventHandler 타입의 변수



--------------------------------------------------------------------

C#에서 EventHandler를 만들고, Event를 만들어서 사용해보자.



(1) 

C#에서는 아래와 같이 편리하게 Handler를 만들 수 있다.



delegate void EventHandler(void);


C언어의 코드와 비교해보면, 포인터 개념이 없고 Ref 개념이기 때문에,

'*' 는 사용하지 않고, typedef 를 써주는 대신 delegate만 사용해줬을 뿐이다.



(2) 

이제, EventHandler(함수, 메소드 포인터) 타입을 정의하였으니, 아래와 같이 

Handler를 사용할 수 있다.


delegate void EventHandler(void);


EventHandler handle = new EventHandler();



(3)

이제, Event를 만들어보자.


Event는 맨 위에서 말했던 것 처럼, event가 발생했을 때, 어떤 로직이 처리될지

그 로직을 정의해놓은 함수(메소드)를 바로 호출할 수 있도록, 그 로직을 포함하는

메소드를 가리키고 있는 함수포인터 값을 가지고 있어야 한다.


event = handler 메소드의 포인터 값.


즉, Event는 handler 값을 가질 수 있어야 함으로,

event자체의 타입은 EventHandler 타입이 될 것이다.



여기서, C#에서는 이 녀석이 Handler 자체를 말하려고 한 것인지, 아니면

Event 이고 값만 handler 를 갖으려고 하는 것인지 구분 할 수 있어야 한다.

event 키워드를 사용한다.




class Foo

{

 event EvenHandler Click;


 Operator+=(EventHandler ev)

  {

     this.Click = &ev;

  }...

};


이제 우리가 흔히 보던 Event 추가하는 코드를 작성 해보면,

-------------------------


void Mouse_Click(void){ cout << "Hello World" <<endl; }


Foo mouse;

mouse.Click += new EventHandler(Mouse_Click);



이제 위와 같이 해주면, 

Click 이라는 이벤트가 발생했을 때, Mouse_Click 메소드가 실행되고,

그 내의 로직이 실행 될 것이다.

--------------------------------------------------------------------



* 정리 *


1. c#에서는 event, eventHandler라는 개념이 있다.

   event : 특정 사건

   eventHandler : 특정 사건에 대한 로직.

   (특정 사건이 발생했을 때, 처리해야할 로직이 담긴 메소드의 포인터.)

   

2. EventHandler는 결국 함수 포인터이다.

   (typedef void (*EventHandler)(void)  == delegate void EventHandler(void) )


3. Event는 event 키워드를 사용하며, EventHandler타입으로 정의된다.

   event EventHandler Click;


4. event에 += 연산자 오버로딩 메소드를 통해, 핸들러를 추가해주면 된다.

'C,C++,C#' 카테고리의 다른 글

[c#] Serialization, Deserialization (직렬화, 역직렬화)  (0) 2016.09.06
블로그 이미지

kuku_dass

,