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);
}
}
}
관련 게시물
'언어 자료구조 알고리즘 > Escort C#' 카테고리의 다른 글
[C#] 12. 직렬화와 리플렉션 - 리플렉션 (0) | 2016.05.16 |
---|---|
[C#] 12. 직렬화와 리플렉션 - 선별적 직렬화 (0) | 2016.05.16 |
[C#] 12. 직렬화 및 리플렉션 - 직렬화 (0) | 2016.05.16 |
[C#] 11. 예외 처리 - 파생 관계의 예외 잡기 (0) | 2016.05.16 |
[C#] 11. 예외 처리 - 예외 클래스 (0) | 2016.05.16 |
[C#] 11. 예외 처리 - 예외처리 구문 (0) | 2016.05.16 |
[C#] 10. .NET 어셈블리 - 모듈 작성 (0) | 2016.05.03 |
[C#] 10. .NET 어셈블리 - XML 문서 파일 (0) | 2016.05.03 |
[C#] 10. .NET 어셈블리 - 공용 어셈블리 (0) | 2016.05.03 |
[C#] 10. .NET 어셈블리 - 전용 어셈블리 (0) | 2016.05.03 |