我有一个顺序结构,我想将其序列化为一个文件,这似乎微不足道。但是,此结构由 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);