XmlTextReader Bug bei Eingabe-Stream nach SP1
Frank Dzaebel, erstellt am: 8.4.2005, zuletzt geändert:  8.4.2005
Kategorie: Serialisierung, .NET-Version: 1.1, Problem-Referenz

Nach einem Upgrade von .NET-1.1 auf .NET-1.1-SP1, kann es u.U. beim XmlTextReader Probleme beim Einlesen geben. Hier ein Workaround dafür.

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; } }