10

型パラメーターで渡されるMemoryStreamオブジェクトがあります (C#の抽象クラスです)。 Stream
Stream

彼のクローンを作成しMemoryStream、元のオブジェクトの現在の位置に別のオブジェクトを作成し、それから新しいオブジェクトも作成しXMLReaderて、その内容を読み取ることができるようにしたいと考えています。

これは私がやったことであり、機能していません ( //*でマークされた行をデバッグしています-> newReaderhas got {None}value)
仮定: メソッド内にあり、Stream currentStream参照があります。

var x = new XmlReaderSettings();
x.IgnoreWhitespace = true;  

 using (var newMemoryStream = new MemoryStream())
 {
         stream.CopyTo(newMemoryStream);

         using (var newReader = XmlReader.Create(newMemoryStream,x)) //*
         {

           Doing some stuff...

         }
 }
4

3 に答える 3

10

newMemoryStream次のように位置をリセットしてください。

newMemoryStream.Position = 0;

作成後stream.CopyTo(newMemoryStream);、作成前XmlReader

したがって、全体は次のようになります。

var x = new XmlReaderSettings();
x.IgnoreWhitespace = true;  

using (var newMemoryStream = new MemoryStream())
{
    stream.CopyTo(newMemoryStream);
    newMemoryStream.Position = 0;

    using (var newReader = XmlReader.Create(newMemoryStream,x)) //*
    {
        Doing some stuff...
    }
}

また、このメソッドに入る前に元のストリームで別のリーダーを使用しているためPosition、ソース ストリームの が実際に必要な場所にあることを確認してください。

于 2012-12-19T22:08:51.483 に答える
5

問題を解決しました!:)
欠けていたものは でマークされてい//*ます。コードは次のとおりです。

var xmlReaderSettings = new XmlReaderSettings();

stream.Position = 0;//*
xmlReaderSettings.IgnoreWhitespace = true;
using (var newMemoryStream = new MemoryStream())
{
    stream.CopyTo(newMemoryStream);
    newMemoryStream.Position = 0;  //*
    using (var newReader = XmlReader.Create(newMemoryStream, xmlReaderSettings))
    {
        newReader.MoveToContent(); //*

        Doing some stuff...
    }
}
于 2012-12-20T11:11:24.610 に答える
3

次の拡張メソッドを使用してMemoryStream、現在の位置を含む を複製し、複製後に元の位置が元の位置に確実にMemoryStreamリセットされるようにすることができます。

public static MemoryStream Clone(this MemoryStream ms) {
    var pos = ms.Position;
    var ms2 = new MemoryStream();
    ms.CopyTo(ms2);
    ms.Position = pos;
    ms2.Position = pos;
    return ms2;
}
于 2015-05-05T14:07:14.347 に答える