2010-07-15 12 views
5

Ich bin mit dem folgenden Problem konfrontiert. Ich muss (binär) einen Strom von Objekten zu einer einzigen Datei auf dem Datenträger (de) serialisieren. Serialisierung ist kein Problem, öffnen Sie einfach einen Stream im Append-Modus und verwenden Sie die BinaryFormatter Serialize-Methode von .Net und Sie sind fertig. Das Problem bei diesem Ansatz besteht darin, dass ich diesen Stream nicht nur der Deserialisierungsfunktion von BinaryFormatter übergeben kann, sondern darin auch eine einzige Instanz des Objekts, das ich serialisiert habe.Binary (De) Serialisierung eines Stromes von Objekten in 1 Datei

Gibt es eine gemeinsame Lösung für dieses Problem? Alle Objekte, die zu einem bestimmten Strom serialisiert sind, sind vom selben Typ, so dass wir zumindest nicht herausfinden müssen, was deserialisiert werden soll, aber das scheint mir keinen Ausweg zu bieten.

Klärung basierend auf Antworten: Die Anzahl der Objekte in erwartet gesendet wird, groß, und es ist daher unmöglich, sie alle in einer Wrapper Sammlung zu halten (wie auf der Festplatte Spülung erfordern würde, sie alle in dem Speicher zu laden -> füge die neuen hinzu -> flush to disk).

  • Normalerweise, wenn Sie ein einzelnes Objekt serialisiert erhalten Sie eine Datei, die enthält:

[Objekt]

  • Was ich schaffe eine Datei, die enthält:

[Objekt] [Objekt] [Objekt] [Objekt] ... [Objekt]

Und ich muss die einzelnen Objektinstanzen deserialisieren.

Vielen Dank im Voraus!

Antwort: Da die Antwort auf die in diesem Thread erwähnt wird (mit ausreichender Klarheit), aber nie explizit gesagt, dachte ich, dass ich es hier angeben werden:

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

Die BinaryFormatter wird deserialisieren ein Objekt zu einem Zeitpunkt wie gewünscht :) Vielleicht möchten Sie die Eigenschaft fileStream.Length zwischenspeichern, da die Länge jedes Mal, wenn Sie die Eigenschaft aufrufen, neu berechnet wird, was die Dinge verlangsamt. Ich habe keine Ahnung, warum das beim ersten Mal nicht funktioniert hat, bevor ich diese Frage gepostet habe, aber es funktioniert jetzt einwandfrei.

Antwort

1

Versuchen Sie, Ihre Objekte in eine serializable Sammlung setzen (ich glaube Liste serializable ist), dann (de) Serialisierung dass Objekt

EDIT als Antwort auf Klarstellung: Ich habe erkannt, dass diese Frage die gleiche Antwort hat wie dies question. Anstatt eine Antwort zu versuchen und neu zu erfinden, würde ich nur einen Blick auf Mark Gravell Antwort oder zu this one

+0

Die Objekte werden während der Lebenszeit des Systems gestreamt und es wird eine sehr große Anzahl von ihnen erwartet Ich muss spülen.Wenn ich sie in der Wrapper-Sammlung halte, muss ich sie alle im Speicher halten und die gesamte Datei jedes Mal neu schreiben, wenn ich auf die Festplatte spülen möchte. – United

+0

der erste Vorschlag funktioniert nicht, wegen der Notwendigkeit einer anderen Bibliothek (aka 6 Monate + Genehmigungsprozess durch legale, wenn ich Glück habe). Der zweite ist faszinierend. Für die zweite Antwort scheint es, dass sie die normale Serialisierung haben, um die Reihe von Objekten aus einer Datei zu deserialisieren, ohne dass sich diese Objekte in der Sammlung befinden. In meinen Tests hat das nicht funktioniert, also werde ich versuchen, es weiter zu untersuchen + vielleicht in dieser SO-Frage weiterzumachen. – United

0

Eine Datei eine Serialisierung ist, so würde ich denken, dass Ihr Stream direkt in eine Datei zu senden würde tun, was Sie scheinen wollen. Eine spezifischere Erklärung Ihrer Situation würde helfen, eine nützlichere Antwort zu geben. (Ich wünschte, ich könnte dies als 'Kommentar' eingeben, aber irgendwie ist der Kommentarknopf für mich nicht verfügbar.)

+0

Serialisierung ist nicht das Problem. Das Problem ist, dass ich den resultierenden Stream nicht deserialisieren kann, wenn ich ein Objekt nach dem anderen serialisiere (was ich muss) und an einen Stream angehängt habe, weil der gesamte Stream kein einzelnes Objekt darstellt. – United

+0

Wenn Sie ein Objekt seriell in eine Datei serialisieren, enthält die Datei normalerweise das eine Objekt (d. H. [Objekt]), um das Objekt zu deserialisieren. Object obj = binaryFormatter.Deserialize (fs, MyObjType); Was ich habe, ist Datei der Form [Objekt] [Objekt] ... [Objekt], so dass ich nicht einfach die Deserialize-Funktion für diese Datei aufrufen kann, da das, was ich dem Deserializer zur Verfügung gestellt habe, keine Serialisierung eines einzelnen Objekts ist. – United

+0

Was ich dachte, ist ein paar Delimiter (vorausgesetzt, es gibt eine Kombination von Symbolen, die ein Serialisierer niemals erzeugen kann). Auf diese Weise kann ich die Datei manuell in Chunks (die ein einzelnes serialisiertes Objekt darstellen) in einem Stream analysieren und Chunks an einen anderen Stream geben, der wiederum an den Deserializer übergeben wird. – United

Verwandte Themen