如何在反序列化时停止使用文件?

时间:2011-10-25 10:21:34

标签: c# serialization

我正在使用: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这个文件,但是当我尝试再次序列化它时,下一步我得到错误:“这个文件正由另一个进程使用”而我无法访问它。

那么如何在反序列化中停止使用错误后的文件?

1 个答案:

答案 0 :(得分:2)

如果抛出异常,您就不会关闭流。使用using声明:

using (Stream stream = File.Open(filename, FileMode.Open))
{
    BinaryFormatter bFormatter = new BinaryFormatter();
    return (ObjectToSerialize) bFormatter.Deserialize(stream);
}

这相当于在finally块中处理流。

这不仅仅是关于反序列化 - 你应该(几乎 1 总是使用using语句来处理非托管资源。任何明确调用CloseDispose(仅在Dispose实施之外发布组合资源)都是可疑的。


1 非常偶尔您希望资源在成功时保持打开状态,但如果其他内容失败则关闭它。这是罕见而尴尬的。