XML Serializer를 이용한 값 복사
클래스의 복제 생성자를 작성하다 보면, 아래와 같은 식으로 값을 넣어주는 경우가 빈번하게 발생합니다.
public CopyClass(CopyClass inst)
{
// 멤버 변수 값 복사 시작
this.Name = inst.Name;
this.Age = inst.Age;
this.Type = inst.Type;
}
꼭 위와 같은 상황의 복제 생성자가 아니더라도, 코드상에서 흔히들 값 복제를 하기 위해 위와 같은 코드를 쭉 나열하는 경우를 볼 수 있는데요.
저 같은 경우에는, 특별히 속도를 중요시해야 하는 상황이 아니라면 다음과 같은 구문으로 해결을 하곤 합니다.
CopyClass org = new ...;
CopyClass inst = CloneData(org);
간단하지요. ^^
뭐 코드도 별거 없습니다. 다음과 같은 식으로 만들어 주면 됩니다.
public static TData CloneData<TData>(TData data) where TData : class
{
if (data == null)
{
return null;
}
XmlSerializer xs = new XmlSerializer(typeof(TData));
string serializedText = ObjectToString(xs, (TData)data);
return (TData) StringToObject<TData>(serializedText);
}
public static string ObjectToString(object data)
{
XmlSerializer xs = new XmlSerializer(data.GetType());
return ObjectToString(xs, data);
}
public static string ObjectToString(XmlSerializer xs, object data)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XmlTextWriter writer = new XmlTextWriter(sw);
xs.Serialize(writer, data);
writer.Flush();
return sb.ToString();
}
public static TData StringToObject<TData>(string text) where TData : class
{
XmlSerializer xs = new XmlSerializer(typeof(TData));
StringReader sr = new StringReader(text);
XmlTextReader reader = new XmlTextReader(sr);
return (TData)xs.Deserialize(reader);
}
XML로 직렬화시키면, 해당 문자열에는 인스턴스에서 가지고 있던 모든 값들이 문자열로 표현이 되어집니다. 그다음, 다시 그 문자열들을 가지고 인스턴스로 복원해 주면 끝!
참고로, 그나마 위의 코드를 좀 더 빠르게 하고 싶다면 다음의 토픽 정도는 한 번 더 읽어주셔야 겠지요. ^^
XmlSerializer 생성자의 실행 속도를 올리는 방법
; https://www.sysnet.pe.kr/2/0/511
XmlSerializer 생성자의 실행 속도를 올리는 방법 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/521
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]