[C#/COMMON] Marshal 클래스 : 객체 직렬화/역직렬화하기

■ Marshal 클래스를 사용해 객체를 직렬화/역직렬화하는 방법을 보여준다.

예제 코드 (C#)

■ Marshal 클래스 : 객체 직렬화/역직렬화하기
————————————————————————————————————————
#region 구조체 객체 직렬화하기 – SerializeStructureObject<T>(sourceObject)

/// <summary>
/// 구조체 객체 직렬화하기
/// </summary>
/// <typeparam name="TStruct">구조체 타입</typeparam>
/// <param name="sourceObject">소스 객체</param>
/// <returns>직렬화 구조체 객체 바이트 배열</returns>
public byte[] SerializeStructureObject<TStruct>(TStruct sourceObject) where TStruct : struct
{
int sourceSize = Marshal.SizeOf(sourceObject);

IntPtr sourceHandle = Marshal.AllocHGlobal(sourceSize);

Marshal.StructureToPtr(sourceObject, sourceHandle, false);

byte[] targetArray = new byte[sourceSize];

Marshal.Copy(sourceHandle, targetArray, 0, sourceSize);

Marshal.FreeHGlobal(sourceHandle);

return targetArray;
}

#endregion
#region 구조체 객체 역직렬화하기 – DeserializeStructureObject<TStruct>(sourceByteArray)

/// <summary>
/// 구조체 객체 역직렬화하기
/// </summary>
/// <typeparam name="TStruct">구조체 타입</typeparam>
/// <param name="sourceByteArray">소스 바이트 배열</param>
/// <returns>역직렬화 구조체 객체</returns>
public TStruct DeserializeStructureObject<TStruct>(byte[] sourceByteArray) where TStruct : struct
{
IntPtr sourceHandle = Marshal.AllocHGlobal(sourceByteArray.Length);

Marshal.Copy(sourceByteArray, 0, sourceHandle, sourceByteArray.Length);

TStruct targetObject = (TStruct)Marshal.PtrToStructure(sourceHandle, typeof(TStruct));

Marshal.FreeHGlobal(sourceHandle);

if(Marshal.SizeOf(targetObject) != sourceByteArray.Length)
{
return default(TStruct);
}

return targetObject;
}

#endregion
—————————————————————————————————-

Advertisements