2015년 10월 8일 목요일

C#의 Serialize 이용하여 손쉽게 class instance 파일로 저장하기


serialize(직렬화)는 파일 저장시 할 때 혹은 네트워크 전송시 주로 많이 사용된다.

WCF에서도 XML형식으로 직렬화하여 전송한다. remote function call 시의 파라미터값이나 콜백 데이터 등을 직렬화 해서 전송하게 되는데 물론 사용자 정의 클래스타입이라면 Contract를 정의해 주어야 하지만 직렬화는 자동으로 진행되므로 매우 편하다.


BinaryWriter를 사용하여 MVC 패턴 형식으로 프로그램 구조를 설계 시 매우 손쉽게 현재 상태를 저장하고 불러오는 형태로 사용 할 수 있다.

다만 직렬화시 귀찮은 작업을 하지 않으려면 몇가지를 고려하여 설계 하는 것이 좋다.

1. 데이터 클래스와 비즈니스 로직은 구분하여 클래스로 작성한다.

  이벤트나 델리게이트의 파라미터나 Argument의      serialize 하기 애매한 객체가 담기는 경우가 있는데  UI Control이나 Winform 객체가 Runtime시에 할당된다면 귀찮은 작업이 필요 해 질 수 있다. 
 코드가 간단한 경우에는 애트리뷰트 설정만하면 해당 필드를 제외 할 수 있지만 복잡한 상속 계층을 가지거나 이미 프레임워크 수준으로 구축되어있다면 모든 코드를 확인해가면서 작업을 해야 할 수도 있다.


2. 직렬화할 데이터를 UI 로직과 분리한다.
 예를 들자면 Winform 의 객체들은 기본적으로  Serializable하지 않다. xml class를 통해서 UI자체도 직렬화 할 수 있긴하지만 그다지 추천할만하지 않다. UI의 구성요소의 갱신은 데이터 클래스와 비즈니스 로직의 산출물을 통해서 갱신되도록 설계하면
 데이터 클래스만 변경한다면 언제든지 변경된 데이터에 맞게 UI를 유지 할 수 있다.

결국은 MVC 패턴대로 설계하면 매우 손쉽게 데이터만 직렬화 역직렬화 할 수 있다는것이다.

우선 Serialize / DeSerialize method 작성































요런 식으로 미리 만들어 두자.

사용은 이런식으로 사용

















ISerializable interface를 구현해도 된다.













GetObjectData는 Serialize, Data(SerializeInfo info, StreamingContext context)는 Deserialize를 구현한다.

댓글 없음:

댓글 쓰기