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를 구현한다.

Mac AppNap 설정

AppNap 이란?
Mac OSX 10.9 부터 실행 중인 앱 중에 다른 앱에 의해 가려지거나 사용하지 않는 것으로 판단되는 앱의 Message 처리를 OS 레벨에서 매우 낮은 우선순위로 하여 배터리 소모를 제한하는 기능이다.

물론 백그라운드 스트리밍이나 다운로드 중인 경우 OSX에서 눈치 채서 제한을 걸지 않지만
정상적인 백그라운드 동작에서도 AppNap기능이 활성화되어 문제가 되는 경우가 있다.

해당 기능이 동작하는지는 Activity Monitor 앱을 통해 확인 할 수 있다.



















defaults 라는 환경 변수 값 비슷한 걸 설정해 주면 기능을 끄거나 켤 수 있다.


Xamarin 을 이용하여 코드를 작성해 보자


우선 설정값을 읽어오는 코드

















defaults read 도메인 키값

형식으로 사용하면되고, NSGlobalDomain은 모든 앱을 설정하기 위한 도메인이다.

NSAppSleepDisabled 키가 AppNap설정을 위한 키의 이름이다.

해당 키값을 읽어오면 AppNap 설정이 활성화 되어있다면 0, 비활성화 상태이면 1을 반환한다.















AppNap 설정 수정하기..

활성화 시키기 위해서는 해당 키를 지우면 된다. delete
비활성화 하기 위해서는 해당 키를 write 하고 값은 -bool YES로 지정한다.


수정된 내용을 적용하기 위해서는 재부팅이 필요하다.





Mac 슬립모드 방지 팁

맥을 사용하다보면 슬립모드에 들어가면 곤란한 경우가 종종 있다.
장시간 구동되는 프로그램이라던지..

대부분 프로그램 상에서 슬립모드에 빠지는 것을 방지하지만 해당 기능이 활성화 되어 있지 않다면
맥에 자체적으로 내장된 기본 유틸인 caffeinate 을 사용하면 된다.

아래 페이지에 방문하면 Man Page에 방문하여 상세한 옵션을 확인 할 수 있다.

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/caffeinate.8.html

Xamarin 프로그램 상에서 간단하게 슬립방지를 하려면 Background Thread를 만들어서
Process를 하나 돌리면 간단하다.

Process가 살아있는 동안은 계속해서 슬립모드 방지 동작한다.
프로그램 시작시 Process 시작 후 종료시 Process를 종료해 주면 간단.