XmlReader
がまたはStream
によって裏打ちされてもしなくてもよいです。私はいくつかのメソッドを使って、Stream
またはTextWriter
をXmlReaderにバックアップしようとしましたが、最終的にはオブジェクトを新しいストリームに書き込むのが最も簡単だと思います。受け入れられた回答が大きな文書ではうまく機能しないため、この方法をお勧めしたいと思います。これは、基本的にJayの回答のBizTalkバージョンが行うものの簡略化されたバージョンです(BizTalkは、 FileStream
またはMemoryStream
とXMLのための他のいくつかの特別な処理を持っている)を使用してください:
public static class XmlExtensions
{
public static MemoryStream ToStream(this XmlReader reader)
{
MemoryStream ms = new MemoryStream();
reader.CopyTo(ms);
return ms;
}
public static FileStream ToStream(this XmlReader reader, string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Create);
reader.CopyTo(fs);
return fs;
}
public static void CopyTo(this XmlReader reader, Stream s)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.CheckCharacters = false; // don't get hung up on technically invalid XML characters
settings.CloseOutput = false; // leave the stream open
using (XmlWriter writer = XmlWriter.Create(s, settings))
{
writer.WriteNode(reader, true);
}
}
}
CopyTo
は、しかし、あなたが好きなあなたは、ストリームのセットアップを設定することができるようになります。 ToStream
は、普通のMemoryStream
(小規模なXMLファイルの場合)やFileStream
(大きいものの場合)を使用したい場合に役立つ一般的なケースです。
XMySerializer.Deserialize(XmlReader reader, object graph)
両方XmlSerializer
とDataContractSerializer
中:あなたは本当にシリアル化の目的のためにこれをやっている場合はもちろん
、最終的には、それだけのようなあなたのシリアライゼーションクラスに過負荷を追加することは良いことですBCLはその考え方に従います...
これは、[通常はUTF8]エンコードされたXML(ほとんどの場合、1文字あたり1バイト)をデコードするオーバーヘッドがあり、各文字は2バイトです(いくつかの文字はI思う)。だから、テキストのデコーディングコストと考慮するダブルサイズのメモリフットプリントがあります。 – redcalx