2013-05-07 15 views
5

Sto creando una libreria di registrazione degli errori che crea un file in una posizione specificata, quindi salva le informazioni di errore in quel file, che possono essere lette da un programma tasker separato che intendo scrivere in congiunzione con questa libreria.Serializzazione e deserializzazione di oggetti multipli

Il modo in cui sto salvando è in formato binario (utilizzando BinaryFormatter() e FileStream()), dove serializzo una classe chiamata ErrorEntry nel file e la aggiungo alla fine del file. Ciò significa che ho una serie di ErrorEntries back to back. Non ce l'ho come lista perché non sembra pratico dover leggere tutte le informazioni in un elenco dal file, aggiungere una voce, quindi salvarla sul file e scaricare le risorse. Sembra molto più efficace dover solo eseguire un singolo comando di scrittura e archiviare ciascuno come oggetto proprio serializzato.

Il mio problema è che posso trovare diversi esempi sulla serializzazione di elenchi o singoli oggetti, ma nulla su più - ma separati - oggetti. Sebbene io voglia salvarli come singoli oggetti, quando li carico voglio leggere l'oggetto e restituire la serie come un elenco di quell'oggetto. Immagino che ci sia qualcosa di simile a

while(!EOF) 
{ 
    //deserialize each object 
    //add individual object to a list 
} 
//return the list of objects 

Come potrei fare per deserializzazione ogni oggetto da un singolo file? Ha un marcatore interno che funziona sopra e ho semplicemente bisogno di rilevare se è la fine del file, o devo fare qualcos'altro per leggerli?

+0

Perché non basta mettere tutti gli oggetti in un '' lista e serializzare quella struttura dati? Impedirai molti casi angolari come le interdipendenze tra oggetti ritenuti "separati". –

+0

@OndrejTucny che vuole aggiungere al file senza caricare tutte le voci precedenti. – weston

+0

Ha detto perché e sembra ragionevole. Per deserializzare a livello di oggetto è necessario scrivere la sequenza delimitatore dopo ogni voce e reagire quando si legge il file indietro. – Tommi

risposta

6

Con FileStream fs; è possibile eseguire fs.Position!=fs.Length per rilevare EOF.

Per l'aggiunta, utilizzare FileMode.Append o fs.Seek(0, SeekOrigin.End); per andare alla fine prima di scrivere la nuova voce.

deserializzazione in piena:

public static ICollection<T> DeserializeList<T>(FileStream fs) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    List<T> list = new List<T>(); 
    while(fs.Position!=fs.Length) 
    { 
     //deserialize each object in the file 
     var deserialized = (T)bf.Deserialize(fs); 
     //add individual object to a list 
     list.Add(deserialized); 
    } 
    //return the list of objects 
    return list; 
} 
+1

Per quanto riguarda la deserializzazione degli oggetti da questo file? Il fatto di poter serializzare molti oggetti sul file tramite append non garantisce che sarà possibile deserializzare di nuovo. – Artemix

+0

@Artemix vedi modifica. Basato sul suo codice in questione. C'è qualcosa di sbagliato in questo? – weston

+0

non utilizzare semplicemente filemode.append e quindi scrivere il lavoro? o devo dire filemode.append e fs.seek? –

Problemi correlati