我们有一个非常奇怪的问题,下面的代码在所有开发人员机器/我们的2个测试服务器上工作正常,包括代码和内置版本,但是当它在带有Windows 2003服务器和asp的虚拟机上运行时。 net v2.0它会抛出错误
无法访问已关闭的流。
public String convertResultToXML(CResultObject[] state)
{
MemoryStream stream = null;
TextWriter writer = null;
try
{
stream = new MemoryStream(); // read xml in memory
writer = new StreamWriter(stream, Encoding.Unicode);
// get serialise object
XmlSerializer serializer = new XmlSerializer(typeof(CResultObject[]));
serializer.Serialize(writer, state); // read object
int count = (int)stream.Length; // saves object in memory stream
byte[] arr = new byte[count];
stream.Seek(0, SeekOrigin.Begin);
// copy stream contents in byte array
stream.Read(arr, 0, count);
UnicodeEncoding utf = new UnicodeEncoding(); // convert byte array to string
return utf.GetString(arr).Trim();
}
catch
{
return string.Empty;
}
finally
{
if (stream != null) stream.Close();
if (writer != null) writer.Close();
}
}
知道为什么会这样做?
答案 0 :(得分:0)
对于Serialize
使用using
,阻止流保持打开。
这样的事情:
using (StreamWriter streamWriter = new StreamWriter(fullFilePath))
{
xmlSerializer.Serialize(streamWriter, toSerialize);
}
答案 1 :(得分:0)
我原本以为是因为你关闭了流然后关闭了作者 - 你应该关闭作者,因为它也将关闭流:http://msdn.microsoft.com/en-us/library/system.io.streamwriter.close(v=vs.80).aspx。< / p>
然而,尽管MSDN受到了保护,但我无法看到任何证据表明它在反映代码时确实会这样做。
但是,看看你的代码,我看不出为什么你首先使用这个编写器。我敢打赌,如果你改变你的代码(我已经把坏异常吞下去了)它会好起来的:
public String convertResultToXML(CResultObject[] state)
{
using(var stream = new MemoryStream)
{
// get serialise object
XmlSerializer serializer = new XmlSerializer(typeof(CResultObject[]));
serializer.Serialize(stream, state); // read object
int count = (int)stream.Length; // saves object in memory stream
byte[] arr = new byte[count];
stream.Seek(0, SeekOrigin.Begin);
// copy stream contents in byte array
stream.Read(arr, 0, count);
UnicodeEncoding utf = new UnicodeEncoding(); // convert byte array to string
return utf.GetString(arr).Trim();
}
}
现在你正在直接使用流,它只会被关闭一次 - 绝对是摆脱这个奇怪的错误 - 我会打赌这可能与服务包或类似的东西有关。