public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Demo d = new Demo();
d.a = 5;
d.b = 10;
d.c = new byte[]{1,2,3};
d.s = "123";
byte[] buf = RawFormatter.RawSerialize(d);
MessageBox.Show("aaa");
}
}
[StructLayout(LayoutKind.Sequential,Pack=1,CharSet=CharSet.Ansi)]
struct Demo
{
public byte a;
public int b;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] c;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string s;
}
public class RawFormatter
{
public static byte[] RawSerialize(object anything)
{
int rawsize = Marshal.SizeOf(anything);
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.StructureToPtr(anything, buffer, false);
byte[] rawdatas = new byte[rawsize];
Marshal.Copy(buffer, rawdatas, 0, rawsize);
Marshal.FreeHGlobal(buffer);
return rawdatas;
}
public static object RawDeserialize(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length)
return null;
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(rawdatas, 0, buffer, rawsize);
object retobj = Marshal.PtrToStructure(buffer, anytype);
Marshal.FreeHGlobal(buffer);
return retobj;
}
}
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Demo d = new Demo();
d.a = 5;
d.b = 10;
d.c = new byte[]{1,2,3};
d.s = "123";
byte[] buf = RawFormatter.RawSerialize(d);
MessageBox.Show("aaa");
}
}
[StructLayout(LayoutKind.Sequential,Pack=1,CharSet=CharSet.Ansi)]
struct Demo
{
public byte a;
public int b;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] c;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string s;
}
public class RawFormatter
{
public static byte[] RawSerialize(object anything)
{
int rawsize = Marshal.SizeOf(anything);
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.StructureToPtr(anything, buffer, false);
byte[] rawdatas = new byte[rawsize];
Marshal.Copy(buffer, rawdatas, 0, rawsize);
Marshal.FreeHGlobal(buffer);
return rawdatas;
}
public static object RawDeserialize(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length)
return null;
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(rawdatas, 0, buffer, rawsize);
object retobj = Marshal.PtrToStructure(buffer, anytype);
Marshal.FreeHGlobal(buffer);
return retobj;
}
}