序列化结构数组的结构时是否存在AccessViolationException?

时间:2009-09-28 14:12:54

标签: c# .net serialization access-violation

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

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

在C#中,实现ISerializable更有意义,并使用BinaryFormatter类将结构写入磁盘。

ISerializable