언어 자료구조 알고리즘/Escort C#

[C#] 12. 직렬화와 리플렉션 - 사용자 지정 직렬화

언제나 휴일 언제나휴일 2016. 5. 16. 14:12
반응형

  12.1.2 사용자 지정 직렬화

 


 

 C#에서는 직렬화할 때 메터데이터 부분을 개발자가 정한 이름으로 직렬화할 수 있게 사용자 지정 직렬화를 제공합니다. 사용자 지정 직렬화하려면 ISerializable 인터페이스를 기반으로 정의해야 합니다.

[Serializable]

class Man:ISerializable

 

 그리고 ISerializable에 기능 약속한 GetObjectData 메서드를 정의합니다.

public void GetObjectData(SerializationInfo info, StreamingContext context)

{

 직렬화할 대상을 SerializationInfo 개체의 AddValue 메서드를 이용하여 원하는 이름으로 값을 추가합니다.

    info.AddValue("이름", Name);

    info.AddValue("나이", Age);

}

 

 사용자 지정 직렬화 형식 개체를 역직렬화를 가능하게 하려면 역직렬화에 사용할 생성자를 추가해야 합니다. 역직렬화에 사용할 생성자의 입력 인자는 GetObjectData 메서드와 같습니다.

public Man(SerializationInfo info, StreamingContext context)

{

 역직렬화하기 위해 SerializationInfo 개체의 GetXXX메서드를 기록한 이름으로 값을 얻어옵니다.

    Name = info.GetString("이름");

    Age = info.GetInt32("나이");

}

 

 다음은 사용자 지정 직렬화 데모 코드입니다.

using System;

using System.Runtime.Serialization;

namespace 사용자_지정_직렬화

{

    [Serializable]

    class Man:ISerializable

    {

        internal string Name

        {

            get;

            private set;

        }

        internal int Age

        {

            get;

            private set;

        }

 

        internal Man(string name, int age)

        {

            Name = name;

            Age = age;

        }

        public override string ToString()

        {

            return string.Format("이름:{0} 나이:{1}", Name, Age);

        }

        public Man(SerializationInfo info, StreamingContext context)

        {

            Name = info.GetString("이름");

            Age = info.GetInt32("나이");

        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)

        {

            info.AddValue("이름", Name);

            info.AddValue("나이", Age);

        }

    }

}

 

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Soap;

namespace 사용자_지정_직렬화

{

    class Program

    {

        static void Main(string[] args)

        {

            Man man = new Man("홍길동", 29); //직렬화 대상 개체

            FileStream fs = new FileStream("man.xml", FileMode.Create); //직렬화 대상 매체

            SoapFormatter sf = new SoapFormatter(); //포멧터

            sf.Serialize(fs, man); //직렬화 수행

            fs.Close();

            FileStream fs2 = new FileStream("man.xml", FileMode.Open);//대상 매체

            SoapFormatter sf2 = new SoapFormatter(); //포멧터

            Man man2 = sf2.Deserialize(fs2) as Man; //역직렬화

            fs2.Close();

            Console.WriteLine(man2);

        }

    }

}

 


관련 게시물

[C#] 12. 직렬화 및 리플렉션 - 직렬화

[C#] 12. 직렬화와 리플렉션 - 선별적 직렬화

[C#] 12. 직렬화와 리플렉션 - 리플렉션

 

반응형