如何克隆MemoryStream对象?
我有一个MemoryStream
对象,它由Stream
类型参数传递
( Stream
是C#中的抽象类)。
我想克隆他,并创建另一个MemoryStream
对象的一侧与原始的当前位置,并创建一个新的XMLReader
,所以我将能够阅读其内容。
这就是我做的,它不起作用(调试标有// * – > newReader
有{None}
值)
假设 :您在方法内部并具有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... } }
确保重置newMemoryStream
上的位置, newMemoryStream
所示:
newMemoryStream.Position = 0;
在stream.CopyTo(newMemoryStream);
之后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
确实在您希望的Position
。
我解决了我的问题! 🙂
缺少的东西标有//*
。 这是应该是的代码:
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... } }
您可以使用以下扩展方法克隆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; }