Здесь происходит то, что вызов метода Save
пытается сериализовать узел, чтобы сохранить его в файле User.config
. Если вы проверите этот файл, вы обнаружите, что узел пуст:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="..." >
<section name="SomeProject.Properties.Settings" type="..." allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<SomeProject.Properties.Settings>
<setting name="SelectedTreeNode" serializeAs="Xml">
<value /> <!-- The node was not serialized! -->
</setting>
</SomeProject.Properties.Settings>
</userSettings>
</configuration>
Возможно, причина в том, что метод Save
пытается сериализовать, используя класс XmlSerializer
, который не учитывает интерфейс ISerializable
, то есть, как сериализация реализована для класса TreeNode
. В какой-то момент он взорвется изнутри и поглотит ошибку, оставив вместо этого пустое значение.
Чтобы обойти это, вы можете сериализовать объект TreeNode
, используя правильный метод сериализации, который является средством форматирования. Форматировщики уважают интерфейс ISerializable
. Затем вы можете сохранить полученный string
в настройке, а затем прочитать его и материализовать в узел:
if (string.IsNullOrWhiteSpace(Properties.Settings.Default.SelectedTreeNode))
{
Properties.Settings.Default.SelectedTreeNode = SerializeNode(treeView.SelectedNode);
Properties.Settings.Default.Save();
}
При загрузке приложения:
if (Properties.Settings.Default.SelectedTreeNode != null)
treeView.SelectedNode= DeserializeNode(Properties.Settings.Default.SelectedTreeNode);
Функции сериализации:
public string SerializeNode(TreeNode node)
{
var formatter = new SoapFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, node);
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
var serialized = reader.ReadToEnd();
return serialized;
}
}
}
public TreeNode DeserializeNode(string nodeString)
{
var formatter = new SoapFormatter();
using (var stream = new MemoryStream())
{
using (var writer = new StreamWriter(stream))
{
writer.Write(nodeString);
writer.Flush();
stream.Position = 0;
var node = (TreeNode)formatter.Deserialize(stream);
return node;
}
}
}
Для этого ответа я использую класс SoapFormatter
. Вам нужно будет добавить ссылку на System.Runtime.Serialization.Formatters.Soap
.