Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenFileDialog文件名序列化_C#_Serialization - Fatal编程技术网

C# OpenFileDialog文件名序列化

C# OpenFileDialog文件名序列化,c#,serialization,C#,Serialization,在编写一个程序时,我需要序列化一个AppSettings对象,该对象由多个属性组成,其中一个属性将用于存储上次使用的文件名,我发现filename属性被放置到我的对象中(通过赋值),但它不会序列化到xml文件。不会引发任何异常,也不会写入任何数据 但反过来说,如果我通过编程修改对象 tc.TheDataFile = "c:\\Documents And Settings\\SomeUser\\Sample\\a test file.txt"; 而不是 tc.TheDataFile = theD

在编写一个程序时,我需要序列化一个AppSettings对象,该对象由多个属性组成,其中一个属性将用于存储上次使用的文件名,我发现filename属性被放置到我的对象中(通过赋值),但它不会序列化到xml文件。不会引发任何异常,也不会写入任何数据

但反过来说,如果我通过编程修改对象

tc.TheDataFile = "c:\\Documents And Settings\\SomeUser\\Sample\\a test file.txt";
而不是

tc.TheDataFile = theDialog.FileName;
那就行了。有人能提供一些关于我所缺少的东西的见解吗

下面是与问题直接相关的程序的简单版本

理论上保存AppSettings的测试类---

下面是提示用户输入文件名的表单。在这个测试中,有一个带有一个按钮的表单

public partial class Form1 : Form
{

    TestClass tc = null;

    public Form1()
    {
        InitializeComponent();

        tc = TestClassHelper.Load();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog theDialog = new OpenFileDialog();
        string fileName = string.Empty;

        theDialog.CheckFileExists = true;
        theDialog.CheckPathExists = true;
        theDialog.Multiselect = false;
        theDialog.FileName = string.Empty;


        if (theDialog.ShowDialog() == DialogResult.OK)
        {
            tc.TheDataFile = theDialog.FileName;
        }
        else
        {
            tc.TheDataFile = string.Empty;
        }
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        TestClassHelper.Save(tc);
    }
}
编辑以添加: 我使用的是MicrosoftVisualStudio2005TeamEdition w/DotNet2.0.50727SP1,没有升级开发环境的选项

解决方案 我不太清楚为什么会发生这种情况,但是OpenFileDialog控件必须更改程序的当前操作目录。当对象反序列化为xml文件时,它不再写入最初打开的位置。而是在新目录中创建


我通过使XML读写位置更具体来纠正这个问题。

问题是您正在设置
tc.TheDataFile=fileNameif
块之后执行code>,但除了将
文件名初始化为
string.Empty
外,您从不将任何内容分配给
文件名。一个解决办法是:

    if (theDialog.ShowDialog() == DialogResult.OK)
    {
        fileName = theDialog.FileName;
    }

    // record last used data file
    tc.TheDataFile = fileName;
或者只是

    if (theDialog.ShowDialog() == DialogResult.OK)
    {
        tc.TheDataFile = theDialog.FileName;
    }

请注意,在调试器中运行测试并“监视”变量会使问题相当容易发现。

抱歉。那一行代码应该被省略。这肯定会引起问题,但那不是问题所在。你介意在没有那行代码的情况下再试一次吗?@user3108410我无法调试你的代码。您是否已在调试器中逐行运行它以查看问题所在?是的。我一直跟踪代码的执行,一直到“Save”方法中的代码行,该方法序列化数据——serializer.Serialize(writer,settings);文件名值出现在“settings”变量中。但是xml文件没有被修改。
    if (theDialog.ShowDialog() == DialogResult.OK)
    {
        tc.TheDataFile = theDialog.FileName;
    }