상세 컨텐츠

본문 제목

직렬화 제어

.Net Framework/.Net Framework 2.0

by 탑~! 2008. 4. 18. 12:50

본문


직렬화 제어

앞서 직렬화에 대한 기본적인 사항을 알아 보았다.
이번에는 직렬화와 역직렬화 과정에 프로그래머가 개입하여 제어하는 방법에대해 알아 보자
 
* 바이너리 직렬화 제어
클래스를 직렬화 할때 특정 속성은 직렬화 하고 싶지 않을 경우가 있다.
나아가 특정 속성을 역직렬화 할때 동적으로 변경하고 싶을 경우도 있다.
 
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 = "역직렬화를 수행하는 컴퓨터명";

               }             

        }



출처 : http://www.mkex.pe.kr/

'.Net Framework > .Net Framework 2.0' 카테고리의 다른 글

Gmail 연동  (0) 2012.03.16
DataSet SerializationFormat  (0) 2008.12.04
직렬화 방법에 따른 크기 비교  (0) 2008.04.18
객체 직렬화  (0) 2008.04.18
.NET의 Enterprise Service(COM+) 이해  (0) 2008.04.04

관련글 더보기