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.
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
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