2009-09-28 2 views
0

У меня есть последовательная структура, которую я хотел бы сериализовать в файл, что кажется тривиальным. Однако эта структура состоит, среди прочего, из 2 массивов других типов структур. Основная структура определяется следующим образом:AccessViolationException при сериализации структуры массивов структур?

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

Я предполагаю, что это потому, что структуры не точно определить, насколько велики массивы, так он не может явно определить размер заранее? Похоже, что, поскольку он не может этого добиться, он не выделяет правильное количество пространства для структуры, и в результате он становится слишком коротким при наведении структуры на указатель. Я не уверен в этом. Почему это может произойти и какие возможные альтернативы?

Edit: Линия метание ошибки является

Marshal.StructureToPtr(structure, buffer, true); 
+0

какая линия бросает ошибку? –

+0

@paintballbob, извините, я добавил это к описанию :) – Chris

+0

У меня нет никакого понимания неуправляемого кода. Но вы компилировали свой код, давая компилятору понять, что вы используете неуправляемый код? Наверное, есть подсказка для компилятора, где вы можете сообщить ему, что вы намерены использовать неуправляемый код. – shahkalpesh

ответ

0

В C# это имеет смысл реализовать ISerializable и использовать класс BinaryFormatter для записи на диск-структуру.

ISerializable

Смежные вопросы