Ես ունեմ մի փոքր դաս, որը ես կցանկանայի օգտագործել կառուցվածքների սերիականացման համար: Ես կցանկանայի իմանալ երկու բան.
Կատարման խնդիր. Քանի որ ես անցնում եմ
Object
- այն անցնում է ընդամենը հղում, այլ ոչ թե կառուցվածքի պատճեն: Եվ քանի որ ես վերադարձնում եմT
տիպի օբյեկտ, այն նաև միայն հղում է փոխանցում:Կոռեկտության խնդիր. Արդյո՞ք այս սերիականացումը կաշխատի բոլոր կառույցների համար: Նկատի ունեմ՝ կա՞ հավանականություն, որ այդ մեթոդները չաշխատեն։
public static byte[] ToByteArray(Object obj) { int size = Marshal.SizeOf(obj); byte[] arr = new byte[size]; IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(obj, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); return arr; } public static T ToStructure<T>(byte[] arr) where T : new() { T str = new T(); int size = Marshal.SizeOf(str); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr, 0, ptr, size); str = (T)Marshal.PtrToStructure(ptr, str.GetType()); Marshal.FreeHGlobal(ptr); return str; }
Շնորհակալություն, տղաներ:
Խմբագրել
Ես հիմա նշում եմ, որ դրանք կառուցվածքներ են: Հիմա ոչինչ չի՞ պատճենվում:
public static byte[] ToByteArray<T>(ref T str) where T : struct
{
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr;
}
public static T ToStructure<T>(byte[] arr) where T : struct
{
T str = default(T);
int size = Marshal.SizeOf(str);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(arr, 0, ptr, size);
str = (T)Marshal.PtrToStructure(ptr, str.GetType());
Marshal.FreeHGlobal(ptr);
return str;
}