Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

[직렬화] 직렬화 제어

작성자 : 박종명
최초 작성일 : 2008-06-16 (월요일)
최종 수정일 : 2008-06-16 (월요일)
조회 수 : 2795

앞서 직렬화에 대한 기본적인 사항을 알아 보았다.
이번에는 직렬화와 역직렬화 과정에 프로그래머가 개입하여 제어하는 방법에대해 알아 보자
 
* 바이너리 직렬화 제어
클래스를 직렬화 할때 특정 속성은 직렬화 하고 싶지 않을 경우가 있다.
나아가 특정 속성을 역직렬화 할때 동적으로 변경하고 싶을 경우도 있다.
 
1. NonSerializedAttribute
간단하게 특정 속성을 직렬화에서 제외하고 싶을 경우네는 [NonSerialized] 특성을 적용하면 된다.
아래 코드는  myIntField 속성을 직렬화 하지 않겠다는 의미를 가진다. 
 

[Serializable]

public class MyClass : ISerializable

{

        [NonSerialized]

        public int myIntField;       

        public double myDoubleField ;

}


 
특정 필드가 숨겨야 할 중요한 정보를 가지고 있다면 직렬화에서 제외해야 할 것이다.
 
2. ISerializable
직렬화/역직렬화 과정에 보다 더 세세히 개입하고 싶다면 ISerializable 를 구현하면 된다.
 
2.1 GetObjectData 메서드
ISerializable 인터페이스는 GetObjectData 메서드를 가지고 있다
이 메서드는 클래스가 직렬화 될때 호출되는 메서드로써 직렬화 과정에 프로그래머가 개입할 수 있도록 한다.
 
2.2 역직렬화를 위한 생성자
ISerializable 를 구현하여 직렬화한 클래스가 역직렬화 될때에는 아래와 은 별도의 생성자를 필요로 한다.
public 생성자(SerializationInfo info,StreamingContext context){
 ....
}
이 생성자는 역직렬화 될때 호출됨으로써 역직렬화 과정에 프로그래머가 개입할 수 있도록 한다.
 
 
3. 샘플
다음 샘플에서는 myConputerName 이라는 현재 컴퓨터 이름을 나타내는 속성이 있다.
직렬화를 수행하는 컴퓨터와 역직렬화를 수행하는 컴퓨터가 다를 수 있다는 점을 감안할때
역직렬화 시 동적으로 현재 환경에 맞도록 컴퓨터 명을 설정하는 예제 이다.

[Serializable]

public class MyClass : ISerializable

{             

        public int myIntField;       

        public double myDoubleField ;

        public string myComputerName;        

 

        public MyClass()

        {

               this.myIntField = 100;

               this.myDoubleField = 200;

               this.myComputerName = Environment.MachineName ;                    

        }

 

        //직렬활 할때 호출되는 메서드

        public void GetObjectData(SerializationInfo info,StreamingContext context)

        {

               info.AddValue("myIntField", this.myIntField);

               info.AddValue("myDoubleField", this.myDoubleField);

               info.AddValue("myDecimalField", this.myComputerName);

        }

}

               //역직렬화 할때 호출되는 생성자

               public MyClass(SerializationInfo info,StreamingContext context)

               {

                       this.myIntField = info.GetInt32("myIntField");

                       this.myDoubleField = info.GetInt64("myDoubleField");

                       this.myComputerName = "역직렬화를 수행하는 컴퓨터명";

               }             

        }


 

이름
비밀번호
홈페이지
XQ <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요