AccessViolationException quando a serialização uma estrutura de matrizes de estruturas?
-
18-09-2019 - |
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);
Solução
não é possível porque as matrizes struct aninhadas. Consulte Quando eu tento usar uma estrutura que contém uma série de outras estruturas, eu recebo uma exceção. O que há de errado? .
Outras dicas
Em C # faz mais sentido para implementar ISerializable e utilizar a classe BinaryFormatter para escrever a estrutura para o disco.