Lösung :
Bevor der XmlTextReader erzeugt wird, sollte der Eingabe-Stream in einen MemoryStream kopiert werden.
Performanceverlust der fett unterlegten Zeilen beim ersten Mal bei einer 1KB grossen Datei etwa 1 Millisekunde. Danach etwa 50 Mikrosekunden (1/1.000.000 s).
public OOScanner(string fileName)
{
Stack stack = new Stack();
ZipFile doc = new ZipFile(fileName);
#region Meta
//Problemzone
ZipEntry ze = doc.GetEntry("meta.xml");
Stream metaStream = doc.GetInputStream(ze);
byte[] data = new byte[ze.Size]; StreamToByteArr(metaStream, data);
XmlTextReader xrMeta = new XmlTextReader(new MemoryStream(data));
while(true) // ....
}
/// <summary>
/// Kopiert Daten eines Streams in ein byte-Array.
/// EndOfStreamException wird ausgelöst, wenn der Stream weniger
/// Daten hat als die byte-Array-Grösse oder bei IO-Exception.
/// </summary>
/// <param name="stream">Der Stream, von dem Daten gelesen werden.</param>
/// <param name="data">Das byte-Array, in das die Daten kopiert werden sollen.
/// Das Array wird komplett mit den Stream-Bytes gefüllt, deswegen muss
/// die Grösse korrekt sein !</param>
public static void StreamToByteArr(Stream stream, byte[] data)
{
int offset=0, remaining=data.Length;
while (remaining > 0)
{
int read = stream.Read(data, offset, remaining);
if (read <= 0)
throw new EndOfStreamException
(String.Format("Ende des Datenstroms erreicht bei {0} " +
"Bytes verbleibenden Bytes zum Lesen", remaining));
remaining -= read; offset += read;
}
}