이 포스트를 만든 목적
- 심심해서
이 포스트의 준비 상황
- gVim 7.2
- Microsoft Visual C# 2010 Express
참조 링크
- http://blog.naver.com/mrlongpark/150051878048
- http://msdn.microsoft.com/ko-kr/library/4abbf6k0%28VS.80%29.aspx
내용
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 라이센스 있는데, 한번 써보자고 건의 해봐야겠다.
'책 정리 > Effective C#' 카테고리의 다른 글
item 30, CLS를 준수하는 어셈블리가 더 좋다. (0) | 2010.07.25 |
---|---|
item 29. 기반 클래스의 변경이 영향을 줄 경우에만 new 한정자를 사용하라. (0) | 2010.07.22 |
item 28, 형변환 연산자의 구현을 피하라 (0) | 2010.07.21 |
item 27, ICloneable의 구현을 피하라 (4) | 2010.07.20 |
item 26, IComparable과 IComparer를 이용하여 순차관계를 구현하라 (6) | 2010.07.19 |
item 24, 명령적 프로그래밍보다 선언적 프로그래밍이 더 좋다. (0) | 2010.07.14 |
item 23, 클래스 내부 객체에 대한 reference 반환을 피하라. (0) | 2010.07.11 |
item 22, 이벤트를 이용하여 외부로 노출할 인터페이스를 정의하라. (0) | 2010.07.10 |
item 21, delegate를 이용하여 콜백을 표현하라. (1) | 2010.07.10 |
item 20, interface의 구현과 virtual 메서드의 overriding을 구분하라. (0) | 2010.07.10 |
최근댓글