Pergunta

Eu tenho uma estrutura seqüencial que eu gostaria de serializar para um arquivo, o que parece trivial. No entanto, esta estrutura consiste, entre outras coisas, 2 baterias de outros tipos de estruturas. A principal struct é definido como segue ...

    [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
    };

Eu posso criar essas estruturas exatamente como pretendido. No entanto, ao tentar serialize com o seguinte método (que parece popular on-line), eu recebo um 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;
    }

Eu estou assumindo que este é porque as estruturas não definir exatamente o quão grande as matrizes são, por isso não pode determinar explicitamente o tamanho de antemão? Parece que uma vez que não pode obter isso, não está alocando a quantidade certa de espaço para a estrutura e ele acaba sendo muito curto quando se molda a estrutura para um ponteiro. Eu não tenho certeza sobre isso. Por que isso pode ocorrer e quais são as alternativas possíveis?

Editar: A linha jogando o erro é

Marshal.StructureToPtr(structure, buffer, true);
Foi útil?

Outras dicas

Em C # faz mais sentido para implementar ISerializable e utilizar a classe BinaryFormatter para escrever a estrutura para o disco.

ISerializable

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top