【问题标题】:AccessViolationException when serializing a struct of arrays of structs?序列化结构数组的结构时出现AccessViolationException?
【发布时间】:2009-09-28 23:10:19
【问题描述】:

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

【问题讨论】:

  • 哪一行报错了?
  • @paintballbob,对不起,我在描述中添加了这个:)
  • 我对非托管代码一无所知。但是,您是否通过让编译器知道您正在使用非托管代码来编译您的代码?我想,编译器有一个提示,你可以让它知道你打算使用非托管代码。
  • 这听起来更像是文件错误,请确保您的文件未设置为只读或被其他程序锁定。
  • @Stan,该文件事先不存在,它正在动态创建。还有@shahkalpesh,这是我会研究的,虽然我不确定从哪里开始。

标签: c# .net serialization access-violation


【解决方案1】:

【讨论】:

  • 这是我的预感。我希望不是这样。谢谢。
【解决方案2】:

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

ISerializable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多