Wie fügt neue Element in das serialisierte xml-Daten, ohne die Daten deserialisiert werden die alten Daten?
Normalerweise verwende ich den folgenden code zum serialisieren von Objekt-zu-XML-Datei. Alltag, ich habe ungefähr 100-1000 neue Elemente Hinzugefügt werden, die in dieser Liste in verschiedener Zeit.
var xmlSerializer = new XmlSerializer(typeof(List<TestModel>));
xmlSerializer.Serialize(stream, list);
Wie fügt neue Element in das serialisierte xml-Daten, ohne die Daten deserialisiert werden die alten Daten?
Dank,
InformationsquelleAutor Soul_Master | 2012-02-20
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie serialisieren objecto Speicher und anfügen an bestehende Datei. Werfen Sie auch einen Blick auf MS-Artikel Effiziente Techniken zur Veränderung Großer XML-Dateien, die zeigt zwei Techniken, die beide gelten in Ihrer situation.
InformationsquelleAutor Pavel Krymets
Gibt es keine Möglichkeit, das zu tun, was Sie wollen, nur anhand der
XmlSerializer
die ich mir denken kann, aber mit ein wenig zusätzliche Arbeit ist dies möglich.Ein einfacher Ansatz wäre, zu serialisieren der Liste für das erste item(s) des Tages - wie Sie Ihren bestehenden code funktioniert. Wenn neue Daten kommt, können Sie nun öffnen Sie die gespeicherte xml-Daten mit einem
XmlDocument
und fügen Sie die Serialisierung von einem einzigen Element zu einem Zeitpunkt.Eine Sache zu beachten ist, dass, wenn die resultierende xml ist extrem groß, das XmlDocument können sehr groß werden (und kann langsam sein oder sogar zu OutOfMemoryExceptions wie Pavel Kyments Hinweise in einem Kommentar), in diesem Fall möchten Sie vielleicht, um zu untersuchen
XmlReader
undXmlWriter
zum Anhängen der xml-Seriell. Aber das Gesamtkonzept würde die gleiche bleiben (open->serialisieren Sie Ihre neue item->fügen Sie die generierte xml->speichern)[BEARBEITEN - geänderten code-Beispiel, um zu zeigen, angekettet
XmlReader
/XmlWriter
eher alsXmlDocument
Ansatz]Etwas entlang diesen Linien:
Hinweis: können Sie die Unterstützung für andere Arten von Knoten (hier weggelassen aus Platzgründen), wie Leerzeichen, Kommentare, Processing Instructions, etc.. Diese alle Folgen dem gleichen Muster wie bei CDATA-oben: ein Fall, rufen Sie die entsprechenden writer-Methode.
Mit dieser aktualisierten Ansatz - Sie haben nie mehr als eine kleine Menge in den Speicher zu einem bestimmten Zeitpunkt.
Hinweis: bei sehr großen Dokumenten XmlDocument wird scheitern, weil es lädt ganze Dokument in den Speicher
in der Tat. Wie bereits oben erwähnt - in diesem Fall eine serielle Ansatz mit
XmlReader
/XmlWriter
vorzuziehen.Wieso der downvote? Ich habe gerade gebucht, eine Prüfung und funktionierende Lösung, und verwies auf die Grenzen dieses Ansatzes, und wie anders es könnte versucht werden, wenn diese nicht ausreichen. Sicherlich eine tatsächliche down-vote ist ein bisschen hart?
Ich denke, dein code ändert sich nichts, da-system, müssen noch analysieren alle XML-Tags in das XML-Dokument. Wenn es mehr als 1k Elemente in der XML-Datei, sollte es einige Zeit dauern, um zu analysieren es.
InformationsquelleAutor Rob Levine
Ich glaube nicht, dass es möglich ist. Sie durchführen wollen, um den wahlfreien Zugriff auf einen block von Daten, die serialisiert und deserialisiert, so hat es, auf die zugegriffen werden sequentiell abgearbeitet.
Vielleicht können Sie direkt ändern Sie das XML-Dokument, das wird schneller sein, aber du wirst verlieren, den Einrichtungen der mit einem serialisiert/deserialisiert Objekt-Baum, die ist viel einfacher zu manipulieren (hinzufügen/entfernen von Objekten, ...)
InformationsquelleAutor Haplo