我正在使用:boito = Serializer.DeSerializeObject("XOPC.xml");
和try catch。
所以这是方法:
public static ObjectToSerialize DeSerializeObject(string filename)
{
ObjectToSerialize objectToSerialize;
Stream stream = File.Open(filename, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
objectToSerialize = (ObjectToSerialize)bFormatter.Deserialize(stream);
stream.Close();
return objectToSerialize;
}
我改变了结构并且没有DeSerialize这个文件,但是当我尝试再次序列化它时,下一步我得到错误:“这个文件正由另一个进程使用”而我无法访问它。
那么如何在反序列化中停止使用错误后的文件?
答案 0 :(得分:2)
如果抛出异常,您就不会关闭流。使用using
声明:
using (Stream stream = File.Open(filename, FileMode.Open))
{
BinaryFormatter bFormatter = new BinaryFormatter();
return (ObjectToSerialize) bFormatter.Deserialize(stream);
}
这相当于在finally
块中处理流。
这不仅仅是关于反序列化 - 你应该(几乎 1 )总是使用using
语句来处理非托管资源。任何明确调用Close
或Dispose
(仅在Dispose
实施之外发布组合资源)都是可疑的。
1 非常偶尔您希望资源在成功时保持打开状态,但如果其他内容失败则关闭它。这是罕见而尴尬的。