Gli oggetti, in genere, hanno un metodo (Serialize) in cui il metodo stesso registra su disco il proprio stato interno o lo carica da disco.
Questo perche' e' solo l'oggetto che puo' accedere ai valori dei propri membri interni e soprattutto perche' l'oggetto "si conosce".
Ovvero, se l'oggetto ha tra i suoi membri, un puntatore ad una stringa, non serve salvare il puntatore (cosa che tu faresti salvando l'oggetto per la sua estensione con la sizeof) per due motivi
1) il valore del puntatore salvato non serve a nulla quando viene recuperato dal disco perche' l'allocazione della memoria in momenti diversi, e' sicuramente non coerente
2) perche' non salvi i dati puntati dal puntatore (cioe' la stringa).
La cosa, come potrai intuire facilmente, si complica maledettamente se l'oggetto disponde di puntatori ad altri oggetti che, a loro volta dispongono di membri come puntatori a stringhe.
Adesso potrai capire *perche'* ti avevo chiesto "notizie" dell'oggetto che stavi trattando ...
In generale, dunque, devi implementare un metodo Serialize che provveda a trattare i valori dei membri verso e dal disco; con tutte le operazioni che ne conseguono.
Fatto per un oggetto, per l'array dovrai chiamare in un ciclo il metodo Serialize per ogni elemento dell'array stesso.
Per inciso, molto di quanto detto, vale anche per le strutture e quindi il metodo che utilizzi tu e' *sbagliatissimo* anche per le strutture. Ma le strutture hanno un problema in piu' che le *differenzia* dall'oggetto di una classe ... non possono disporre di un metodo Serialize e quindi devi pensarci tu al trattamento corretto di tutti i suoi membri.
Buon lavoro.