2009-09-28 5 views
0

J'ai une structure séquentielle que je voudrais sérialiser dans un fichier, ce qui semble trivial. Cependant, cette structure est constituée, entre autres, de 2 réseaux d'autres types de structures. La structure principale est définie comme suit ...AccessViolationException lors de la sérialisation d'une structure de tableaux de structures?

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

Je peux créer ces structures exactement comme prévu. Cependant, en essayant de sérialisation avec la méthode suivante (qui semble en ligne populaire), je reçois un 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; 
    } 

Je suppose que c'est parce que les structures ne définissent pas exactement la taille des tableaux sont, donc il ne peut pas déterminer explicitement la taille à l'avance? Il semble que puisqu'il ne peut pas obtenir cela, il n'alloue pas la bonne quantité d'espace pour la structure et il finit par être trop court lors de la transformation de la structure en pointeur. Je ne suis pas sûr à ce sujet. Pourquoi cela pourrait-il se produire et quelles sont les alternatives possibles?

Edit: La ligne de lancer l'erreur est

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

quelle ligne génère l'erreur? –

+0

@paintballbob, désolé j'ai ajouté cela à la description :) – Chris

+0

Je n'ai aucune compréhension du code non managé. Mais avez-vous compilé votre code en informant le compilateur que vous utilisez du code non géré? Je suppose, il y a un indice au compilateur où vous pouvez le faire savoir que vous avez l'intention d'utiliser du code non managé. – shahkalpesh

Répondre

0

En C#, il est plus logique de mettre en œuvre ISerializable et utiliser la classe BinaryFormatter pour écrire le struct sur le disque.

ISerializable

Questions connexes