BinaryFormatter.Serialize() 是否在 FileStream.Flush() 和 FileStream.Close() 之前完成?

Does the BinaryFormatter.Serialize() finish before FileStream.Flush() and FileStream.Close()?

我将 class 的列表保存到二进制文件中并使用 FileStream 和 BinaryFormatter。

private void SaveCustomers()
{
  FileStream fs = null;

  try
  {
    fs = new FileStream( Application.StartupPath + dataPath + @"\" + customersFilename, FileMode.Create, FileAccess.Write );
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(fs, customers);

  }
  catch (Exception ex)
  {
    MessageBox.Show( ex.Message, "Fehler beim speichern der Besucherdaten", MessageBoxButtons.OK, MessageBoxIcon.Error );
  }
  finally
  {
    if (fs != null)
    {
      fs.Flush();
      fs.Close();
    }
  }
}

在我的程序中的某个时刻,文件得到 "destroyed"。由于这是唯一有权写入文件的方法,我认为这个方法是有问题的。

我的假设是当 Filestream 刷新并关闭时 BinaryFormatter 没有完成。

这是最近才发生的,因为文件在开始时大约有 8 MB,但它运行完美。

我的假设是否正确?还是完全不同。

private void LoadCustomers()
{
  FileStream fs = null;

  try
  {
    fs = new FileStream( Application.StartupPath + dataPath + @"\" + customersFilename, FileMode.OpenOrCreate, FileAccess.Read );
    BinaryFormatter bf = new BinaryFormatter();
    customers = (List<Customer>)bf.Deserialize( fs );

    if (customers == null) customers = new List<Customer>();
  }
  catch (Exception ex)
  {
    MessageBox.Show( ex.Message, "Fehler beim laden der Besucherdaten", MessageBoxButtons.OK, MessageBoxIcon.Error );
  }
  finally
  {
    if (fs != null)
    {
      fs.Flush();
      fs.Close();
    }
  }
}

最后一个密码是我的reader。

您使用 FileMode.Create 这会导致您的程序在文件已经存在时覆盖它。 (我想这就是你所说的 "the file gets destroyed".

如果您想添加新行,例如在日志文件中,您应该使用 FileMode.OpenOrCreate...

查看:MSDN 创建:

Specifies that the operating system should create a new file. If the file already exists, it will be overwritten. This requires FileIOPermissionAccess.Write permission. FileMode.Create is equivalent to requesting that if the file does not exist, use CreateNew; otherwise, use Truncate. If the file already exists but is a hidden file, an UnauthorizedAccessException exception is thrown.