이 포스트를 만든 목적

  • 심심해서

이 포스트의 준비 상황

  • gVim 7.2
  • Microsoft Visual C# 2010 Express

참조 링크

내용

C# serializable 이란 무엇인가?

우리나라 말로는 "직렬 가능한" 이란 뜻인데, 무엇을 직렬 하는가 하면, 바로 "객체"이다.

왜 serialization 해야 하는가?

객체를 serialization 하면, 다음과 같은 일을 손쉽게 처리 할 수 있기 때문이다.

  • 네트워크 패킷으로 전송 하기
  • 파일로 저장하기
  • 기타 다른 매체에 손쉬게 저장 할 수 있다.

C# 꼭 Serializable 타입으로 만들어야 하는가?

책에선 이유로써, 다음의 이유로 만드는 것을 추천하고 있다.

  • 다른 사람이 serialization 이 불가능 한 경우(private 멤버에 접근 할 수 없을 경우)가 생길 수 있으므로..
  • 모든 개발자들이 타입들이  serializable 가능하다고 생각하기 때문에

하지만 나는, 다음의 이유로 꼭 할 필요는 없다고 본다.

  • serialization 하지 않을 타입들이 더 많으므로
  • 관리해야 하는 코드가 더 늘어 나게 됨으로써
  • 교차 언어를 사용 하는 환경에서는 C# 직렬화는 공통 분모로 뺄 수 없으므로
    - 이것은 타격이 좀 크다,

  • 꼭 C# 직렬화 만이 답이 될 수 없다.
    - 많은 경우, 독자 포맷, 혹은 다른 직렬화 방법들이 더 편하고, 더 좋다.

$ 각 개인의 생각 차이므로, 혹여나 이 포스트를 보는 사람들은 책의 저자나, 나의 말에 귀 기울이지 말고, 스스로 생각한 답으로 행동하길 바랍니다.

C#에서 어떻게 serializable 타입을 만들 수 있는가?

Attribute 로 Serializable 을 사용 하면 된다. 다음 예제를 보면:

오~ 간단한데? 라고 생각했지만, 아니올시다. 다음의 경우에는 몇가지 예외처리를 반드시 해주어야 한다.

  • 객체 내부에 Non-serializable type 이 있을 경우 - 직렬화 대상이 아닌 것
    - 이 경우 간단하게 [NonSerialized] attribute를 대상 변수에 사용 하면 된다.

  • 객체 내부에 Un-serializable 변수가 있을 경우 - 직렬화가 되지 않는 것
    - 이 경우 Un-serializable 타입을 제외하고 직렬화 하거나, 포기, 또는 ISerializable 인터페이스를 구현해 주면 된다.
    물론 이렇게 할 경우 Private 생성자를 구현하여, DeSerialization 을 구현해 두어야 한다. : 샘플 코드 제외

  • 객체가 버전간 서로 다를 경우 - 1.0 Version 과 1.1 Version 간 객체가 다를 경우
    - 이 경우 별도로 Private 생성자를 구현해 주면 된다. 다음 샘플 코드를 보라.


더 알아야 할 사항이 있는가?

  • 직렬화 과정 중 보안을 설정할 수 있다. SecurityPermission Attribute 를 사용 하면 된다.
  • 객체간 상속으로 하위 클래스의 변수들이 serialization 이 안될 수 있다. 그래서 권고사항으로 최하위 클래스에서만 ISerializable 인터페이스를 사용하여, GetObjectData 를 구현하라고 한다.
    - 이 경우, 가상함수를 이용해, 극복하는 방법이 있다. 코드는 생략한다.

결론

  • C# 에서만 사용 할 경우, 직렬화를 고려해 볼만하다.

여담

  • 아.. 무척 졸렵다. 이제 비가 그쳤다.
  • ... 직렬화는 여러가지로 귀찮은 작업이다. 개인적인 생각으로, XML 이나, 기타 다른 언어 포맷으로 바로 써 버리면 좋겠다.
  • Microsoft Visual C# 2010 Express 를 오늘 써 보았는데, .. 비쥬얼이 좋아졌고, 디버깅도 재미있다. 회사에 2010 라이센스 있는데, 한번 써보자고 건의 해봐야겠다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기