给出以下代码片段:
try
{
var myTxt = "";
var serializer = new DataContractSerializer(myObject.GetType());
var memoryStream = new MemoryStream()
serializer.WriteObject(memoryStream, myObject);
memoryStream.Position = 0;
using (var reader = new StreamReader(memoryStream))
{
myTxt = reader.ReadToEnd();
}
.
.
.
}
catch (IOException ioEx)
{
//log or whatever...
throw;
}
通常我的内存流周围都有一个using语句, 但根据我的理解,处理StreamReader将关闭内存流。
所以问题是,上面有什么真正的错误吗?
答案 0 :(得分:3)
您可以简化代码,因为我没有看到写作,倒带和阅读的重点:
var serializer = new DataContractSerializer(facets.GetType());
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, facets);
string xml = Encoding.UTF8.GetString(stream.ToArray());
}
答案 1 :(得分:1)
使用
是一个好习惯using (var stream = new MemoryStream(...))
using (var reader = new StreamReader(stream))
{
myTxt = reader.ReadToEnd();
}
此处流和阅读器都将按运行时处理
或Close()
手动读取器(编写器)和流
答案 2 :(得分:1)
为了测试你的场景,我添加了
memoryStream.Seek(0, SeekOrigin.Begin);
到最后并收到System.ObjectDisposedException
,您的代码似乎有效。
当然vcsjones
的评论也有效。
答案 3 :(得分:1)
我觉得很好,因为MemoryStream
无法保留非托管资源,但如果你想要更加安全,你可以这样做:
var memoryStream = new MemoryStream()
StreamReader reader = null;
try{
serializer.WriteObject(memoryStream, myObject);
memoryStream.Position = 0;
reader = new StreamReader(memoryStream)
//...
}
finally
{
if(reader != null)
reader.Dispose();
else
memoryStream.Dispose();
}