ファイルにシリアライズしたいシーケンシャル構造体がありますが、これは些細なことのようです。ただし、この構造体は、とりわけ、他のタイプの構造体の 2 つの配列で構成されています。主な構造体は次のように定義されています...
[StructLayout(LayoutKind.Sequential)]
public struct ParentStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public const string prefix = "PRE";
public Int32 someInteger;
public DataLocater[] locater; //DataLocater is another struct
public Body[] body; //Body is another struct
};
これらの構造体を意図したとおりに作成できます。ただし、次の方法 (オンラインで人気があるようです) でシリアル化しようとすると、AccessViolationException が発生します。
public static byte[] RawSerialize(object structure)
{
int size = Marshal.SizeOf(structure);
IntPtr buffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(structure, buffer, true);
byte[] data = new byte[size];
Marshal.Copy(buffer, data, 0, size);
Marshal.FreeHGlobal(buffer);
return data;
}
これは、構造体が配列の大きさを正確に定義していないため、事前にサイズを明示的に決定できないためだと思いますか? それを取得できないため、構造体に適切な量のスペースを割り当てておらず、構造体をポインターにキャストするときに短すぎてしまうようです。これについてはよくわかりません。なぜこれが発生する可能性があり、可能な代替手段は何ですか?
編集:エラーをスローしている行は
Marshal.StructureToPtr(structure, buffer, true);