Sono di fronte al seguente problema. Ho bisogno di (de) serializzare (binario) un flusso di oggetti su un singolo file su disco. La parte di serializzazione non è un problema, basta aprire un flusso in modalità append e utilizzare il metodo Serialize di .Net di BinaryFormatter e il gioco è fatto. Il problema con questo approccio è che non posso dare questo flusso alla funzione di deserializzazione di BinaryFormatter, ciò che contiene non è una singola istanza dell'oggetto che ho serializzato.Serializzazione binaria (De) di un flusso di oggetti in 1 file
Esiste una soluzione comune a questo problema? Tutti gli oggetti serializzati su un determinato stream sono dello stesso tipo, quindi almeno non abbiamo bisogno di capire cosa debba essere deserializzato, questo è un dato, ma non sembra suggerire una via d'uscita da questo per me.
Chiarimento sulla base di risposte: Il numero di oggetti inviati dovrebbe essere di grandi dimensioni ed è quindi praticamente impossibile per tenere tutti in una collezione involucro (come vampate di calore su disco richiederebbe a tutti loro caricare nella memoria -> aggiungi i nuovi -> flush to disk).
- Normalmente, quando si serializzare un singolo oggetto si ottiene un file che contiene:
[Oggetto]
- Quello che sto creando è un file che contiene:
[Oggetto] [Oggetto] [Oggetto] [Oggetto] ... [Oggetto]
E ho bisogno di deserializzare le singole istanze dell'oggetto.
Grazie in anticipo!
Risposta: Dal momento che la risposta si allude a questa discussione (con sufficiente chiarezza), ma mai esplicitamente dichiarato, ho pensato io premetto qui:
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
Il BinaryFormatter si deserializzare un oggetto alla volta come desiderato :) Si potrebbe desiderare di memorizzare nella cache la proprietà fileStream.Length, poiché la lunghezza sembra essere ricalcolata ogni volta che si chiama la proprietà, rallentando le cose. Non ho idea del perché questo non ha funzionato la prima volta che ho provato prima di pubblicare questa domanda, ma ora funziona perfettamente.
gli oggetti sono in streaming durante la vita del sistema e c'è un numero molto grande di loro previsto , Ho bisogno di sciacquare.Tenendoli nel wrapper-collection dovrò tenerli tutti in memoria e riscrivere l'intero file ogni volta che voglio scaricare su disco. – United
il primo suggerimento non funziona, a causa del bisogno di un'altra libreria (alias 6 mesi + processo di approvazione legale, se sono fortunato). Il secondo è intrigante. Per la seconda risposta, sembra che abbiano la normale serializzazione per deserializzare la serie di oggetti da un file senza che questi oggetti siano nella raccolta. Nei miei test non ha funzionato, quindi suppongo che cercherò di esaminarlo ulteriormente + forse di dare seguito a questa domanda. – United