的XmlReader
可能会或可能不会被一个Stream
支持。我用一些使用反射的方法愚弄了一下,试图获得支持XmlReader的Stream
或TextWriter
,但最终我认为将对象写入新流可能是最直接的;我推荐这种方法超过了接受的答案,因为接受的答案在大型文档中表现不佳,这基本上是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(每个字符大多为单个字节)的开销,对于每个字符为两个字节的字符串(一些字符多于I认为)。所以需要考虑文本解码成本和双倍大小的内存占用空间。 – redcalx