2010-07-15 8 views
5

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.

risposta

1

Prova a mettere gli oggetti in una raccolta serializable (credo List è serializzabile), poi (de) serializzazione che oggetto

EDIT in risposta a un chiarimento: Ho appena realizzato che questa domanda ha la stessa risposta come questo question. Piuttosto che cercare di reinventare una risposta, mi basta dare un'occhiata alla risposta di Marco Gravell, o per this one

+0

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

+0

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

0

Un file è una serializzazione, quindi penserei l'invio del flusso direttamente in un file sarebbe fare quello che sembra voler Una spiegazione più specifica della tua situazione sarebbe di aiuto, per fornire una risposta più utile. (Vorrei inserire questo come un 'commento', ma in qualche modo il pulsante commento non è disponibile per me.)

+0

La serializzazione non è il problema. Il problema è che se serializzo un oggetto alla volta (che devo) e li aggiungo a un flusso, non posso deserializzare il flusso risultante, perché l'intero flusso non rappresenta un singolo oggetto. – United

+0

Fondamentalmente, normalmente quando serializzi un oggetto in un file, il file conterrà quell'unico oggetto (cioè [Object]) in modo da deserializzare l'oggetto Object obj = binaryFormatter.Deserialize (fs, MyObjType); Quello che ho è il file del modulo [Object] [Object] ... [Object] quindi non posso semplicemente chiamare la funzione deserialize su questo file, poiché ciò che ho fornito al deserializzatore non è una serializzazione di un singolo oggetto. – United

+0

Quello che stavo pensando è inserire alcuni delimitatori (ammesso che esista una combinazione di simboli che un serializzatore non può mai produrre). In questo modo posso analizzare manualmente il file in blocchi (che rappresenta un singolo oggetto serializzato) in un flusso e dare i pezzi a un altro flusso, che a sua volta è dato al deserializzatore. – United

Problemi correlati