Form.OpenFileDialog使BinaryFormatter.Serialize停止工作

时间:2010-07-30 08:01:46

标签: c# winforms

我有一个问题,我不知道如何解决 我有一个打开OpenFileDialog的表单来添加数据 但在我调用OpenFileDialog.Show()后,我无法使用BinaryFormatter.Serialize保存任何内容。
奇怪的是,我甚至不需要使用我从OpenFileDialog获得的数据,只是打开对话框使后续调用Serialize停止工作。

停止工作意味着不会保存新数据。

我没有收到任何错误消息或异常,它只是默默地失败 有没有人有什么指针可以解决问题。
当我添加OpenFileDialog并切换到BinaryFormatter.Serialize时,我使用了XmlSerializer,希望它应该对我遇到的任何问题更具抵抗力,所以我很确定它会影响XmlSerializer。

我正在使用.NET 4.0

相关代码(我希望)是:
保存:

    public void Save()
    {
        File.Delete(fileName);
        using (Stream stream = File.Open(fileName, FileMode.Create))
        {
            BinaryFormatter bin = new BinaryFormatter();
            bin.Serialize(stream, contactList);
        }

    }

负载:

  private void LoadContactList()
    {
        if (File.Exists(fileName))
        {
            using (Stream stream = File.Open(fileName, FileMode.Open))
            {
                BinaryFormatter bin = new BinaryFormatter();
                contactList = (List<Contact>)bin.Deserialize(stream);
            }
        }
        else
        {
            // start on a new database
        }
   }

使用OpenFileDialog:

   private void btnPhoto_Click(object sender, EventArgs e)
    {
        if (DialogResult.OK == ofdPhoto.ShowDialog(this.Parent))
        {
            // signalling that the dialog have been used have have
            // useful data
            ofdPhoto.Tag = (object)true;
        }
    }

我正在保存的是List:

List<Contact> contactList;

我在列表中只有Person

[Serializable]
public class Person : Contact
{
    #region variables and properties

    //public string Photo { get; set; }
    public string Photo;

    private string lastName;
    public string LastName
    {
        get { return lastName; }
        set { lastName = value; base.ComparisonKey = value; }
    }

    public string FirstName { get; set; }
    //  no contructor
}

修改

在程序结束时,我保存了所有数据:

  private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        data.Save();
    }

我使用OpenFileDialog获取的文件名路径用于照片 路径被剥离,只存储文件名。那部分我已经检查了。
 文件名存储在Person对象中,Person对象存储在List
中 并且在程序结束时整个数组都是持久的 结束编辑
它不依赖于我正在加载的字符串的格式

编辑:在使用BinaryFormatter.Serializer保存之前,我在OpenFileDialog上调用了Dispose 当我注释掉btnPhoto_Click的内容时,它会运行BinaryFormatter.Serializer。

我会赞美任何想法。

1 个答案:

答案 0 :(得分:1)

我没有使用绝对路径保存文件,只使用文件名。当使用OpenFileDialog时,当前目录已更改,数据,数组存储在当前目录中,该目录与程序开头完全不同。

当我重新启动程序时,当前目录被重置,所有数据似乎都被丢弃了 这个link中描述了一种解决方案 或者只是将当前目录保存在字段link