[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Data
{
public int MessageID;
public double Price;
public long Number;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Str;
}
LayoutKind.Sequential:依宣告順序緊密排列。Pack = 1:1 位元組對齊,無填充。MarshalAs(ByValTStr, SizeConst=20):固定長度 20 字元 ANSI 字串。
public byte[] RawSerialize(object obj)
{
int size = Marshal.SizeOf(obj);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, ptr, false);
byte[] bytes = new byte[size];
Marshal.Copy(ptr, bytes, 0, size);
Marshal.FreeHGlobal(ptr);
return bytes;
}
public Data RawDeserialize(byte[] bytes)
{
int size = Marshal.SizeOf(typeof(Data));
if (size > bytes.Length) return new Data();
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(bytes, 0, ptr, size);
object obj = Marshal.PtrToStructure(ptr, typeof(Data));
Marshal.FreeHGlobal(ptr);
return (Data)obj;
}
private void btnTest_Click(object sender, EventArgs e)
{
var item = new Data { MessageID = 1, Number = 100, Price = 1.2, Str = "ABCD" };
byte[] data = RawSerialize(item);
MemDB.Write(data, data.Length); // 寫入共享記憶體
}
private void ReadStruct()
{
byte[] data = new byte[MemDB.GetLength()];
MemDB.Read(ref data);
var item = RawDeserialize(data);
MessageBox.Show($"{item.MessageID},{item.Number},{item.Price},{item.Str}");
}
此技術常用於高效能進程間通訊、硬體介面資料交換。