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