728x90
반응형
728x170
▶ Marshal 클래스 : 객체 직렬화/역직렬화하기 예제
using System.Runtime.InteropServices;
...
/// <summary>
/// 소스 항목
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SourceItem
{
/// <summary>
/// 값 1
/// </summary>
public int Value1;
/// <summary>
/// 값 2
/// </summary>
public double Value2;
/// <summary>
/// 값 3
/// </summary>
public byte Value3;
}
...
SourceItem sourceItem = new SourceItem();
sourceItem.Value1 = 1;
sourceItem.Value2 = 2;
sourceItem.Value3 = 3;
byte[] sourceArray = SerializeStructureObject<SourceItem>(sourceItem);
SourceItem targetItem = DeserializeStructureObject<SourceItem>(sourceArray);
728x90
▶ 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
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 프로세스 CPU 사용률 제한하기 (0) | 2019.09.04 |
---|---|
[C#/COMMON] 프로세스 CPU 사용률 제한하기 (0) | 2019.09.04 |
[C#/COMMON] PerformanceCounter 클래스 : 인스턴스명으로 프로세스 CPU 사용률 구하기 (0) | 2019.09.04 |
[C#/COMMON] PerformanceCounter 클래스 : 프로세스명으로 인스턴스명 딕셔너리 구하기 (0) | 2019.09.04 |
[C#/COMMON] Array 클래스 : Resize 정적 메소드를 사용해 배열 크기 변경하기 (0) | 2019.08.30 |
[C#/COMMON] Marshal 클래스 : 객체 직렬화/역직렬화하기 (0) | 2019.08.29 |
[C#/COMMON] Marshal 클래스 : 비관리 메모리 할당하기 (0) | 2019.08.29 |
[C#/COMMON] 리스트 데이터 지우기 (0) | 2019.08.27 |
[C#/COMMON] 강력한 형식의 어셈블리에서 서명되지 않은 어셈블리 참조 문제 해결하기 (0) | 2019.08.19 |
[C#/COMMON] MAC 주소 구하기 (0) | 2019.08.16 |
[C#/COMMON] 임의 문자열 구하기 (0) | 2019.08.16 |
댓글을 달아 주세요