Verwenden von MemoryStream zum Schreiben in XML

8

Ich habe zwei verschiedene Ansätze zum Schreiben von Daten in eine XML-Datei bemerkt (die Fehlerbehandlung wurde aus Platzgründen weggelassen).

Bei der ersten Methode erstellen Sie das XML-Dokument und speichern das XML einfach in einer Datei:

%Vor%

Bei der zweiten Methode erstellen Sie einen MemoryStream und speichern dann den MemoryStream in einer Datei:

%Vor%

Ich vermute, die Logik für die Verwendung eines MemoryStream besteht darin, sicherzustellen, dass die XML-Datei erstellt werden kann, bevor versucht wird, die Datei zu speichern. Würde die MemoryStream-Methode ein Atomic-Write-Ereignis bereitstellen und / oder vor Schreibproblemen schützen, während Sie der XML-Datei Einträge hinzufügen?

Kann jemand erklären, ob dies tatsächlich notwendig ist oder nur eine übertriebene Möglichkeit, meinem Projekt unnötige Codezeilen hinzuzufügen?

    
Dscoduc 28.01.2009, 08:10
quelle

6 Antworten

15

Die MemoryStream Version ist bei dieser Gelegenheit verschwenderisch. MemoryStream ist nützlich, wenn Sie Stream -ähnliche Arbeit ausführen möchten, aber keine tatsächliche Datei möchten. Wenn Sie eine Datei schreiben, schreiben Sie einfach in die Datei. Dies vermeidet die Notwendigkeit, alle Daten im Speicher zu puffern.

    
Marc Gravell 28.01.2009, 08:21
quelle
3

Es ist richtig, dass der Speicher-Stream-Ansatz für einfache Operationen verschwenderisch ist, aber er ist sehr nützlich für Fälle wie das Speichern der XML als verschlüsselte Datei, als komprimierte Datei usw.

    
Barak C 01.11.2009 16:17
quelle
2

Das ist Overkill und eine Verschwendung.

Die beiden wichtigsten Ansätze basieren auf

  1. Sie kennen die vollständige Struktur des Dokuments bis zum Ende nicht.
  2. Wenn Sie die Teile des Dokuments erstellen, wissen Sie, dass sie die endgültige Form dieses Teils des Dokuments darstellen.

Der erste erfordert die Erstellung eines In-Memory-Modells des Dokuments (für das das DOM-Modell entworfen wurde). Sobald Sie damit fertig sind, ist es einfach, direkt in den Dateistream zu schreiben.

Mit der zweiten Option sparen Sie viel Speicherplatz und Komplexität und verwenden einfach XmlWriter die direkt auf den Endstream verweisen können (in diesem Fall ein Dateistream).

In keinem Stadium ist es notwendig, einen MemoryStream zu verwenden

    
ShuggyCoUk 28.01.2009 08:23
quelle
1

Wenn Sie (aus irgendeinem Grund) sicherstellen möchten, dass der XmlWriter erfolgreich ist (dh, die Datei wird möglicherweise abgeschnitten, aber in den meisten Fällen - wie bereits erwähnt - nicht durch das Schließen von Tags), können Sie einen temporären Dateistream verwenden. fx etwas ähnliches:

%Vor%

Das verwendete wie:

%Vor%

Dies wird nicht viel Speicher verbrauchen (natürlich macht es nur Sinn / macht mehr Sinn, wenn das resultierende XML groß ist)

    
veggerby 28.01.2009 10:43
quelle
1

Ich denke, dass die Verwendung eines Speicherstreams nützlich wäre, wenn das Dokument in einer Web-App oder einem Web-Service erstellt wird. Der Speicherort der Datei kann zu einem Konflikt mit einem anderen Prozess führen, der dieselbe Verarbeitung ausführen könnte, was zu ungültigen Ergebnissen führen kann. In einem Speicher-Stream sollte die Verarbeitung getrennt sein.

    
Rich 01.02.2010 22:54
quelle
0

Sie müssen keinen MemoryStream verwenden, um den XmlWriter zu verwenden. Der XmlWriter kann direkt in eine Datei schreiben; Sie können eine andere Überladung der XmlWriter.Create-Methode verwenden, die einen Dateinamen als Argument verwendet, oder statt in einen MemoryStream zu schreiben, könnten Sie auch in einen XmlTextWriter oder einen FileStream schreiben.

Also könnten Sie Ihren zweiten Code-Code schreiben als:

%Vor%

AFAIK, der XmlWriter schützt Sie nicht vor dem Erstellen eines nicht gut gemachten Xml.

    
Frederik Gheysels 28.01.2009 08:15
quelle

Tags und Links