在winforms .Net 3.5 SP1中保存类库用户设置

时间:2010-07-08 15:53:39

标签: c# .net vb.net winforms settings

前段时间,我编写了自己的设置提供程序,因为我在类库中持久保存时遇到问题。 (注意 - 从应用程序中保留设置没有问题。)

今天,我刚刚对持久化类库设置进行了测试,并且没有我的自定义提供程序。 测试是:

(1)创建一个类库 (2)添加设置 - “名称”
(3)添加一个具有公共共享属性“Name”的类,该类读取和写入“Name”设置 (4)创建引用类库的应用程序,并使用共享属性读取和写入“名称”设置。

我确信在“名称”设置在应用程序打开时仍然存在但在关闭它并重新打开之后,该设置将恢复为默认设置。 这种情况现在还没有发生,我想确定我以前是个白痴而不是白痴。

我现在得到的行为是预期的行为吗?

ETA:我注意到我第一次创建测试应用,更改设置,关闭并重新打开时,设置不会保留。随后是。可能是我经过一次尝试后放弃了。任何想法为什么它不是第一次坚持?

ETA2:作为一个例子,我有一个名为“MyLibrary”的类库和一个名为“MyApp”的测试应用程序。我执行上面的步骤1-4,以下是在C:\ Documents and Settings \ User Name \ Local Settings \ Application Data \ MyApp \ MyApp.vshost.exe_Url_vi5gjcooahbdm2ma3dcay0mkexu2suul \ 1.0.0.0中找到的user.config文件的内容。注意:我没有触摸MyApp中的设置; -

<configuration>
<configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral >
        <section name="MyLibrary.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
</configSections>
<userSettings>
    <MyLibrary.My.MySettings>
        <setting name="Name" serializeAs="String">
            <value>New changed value</value>
        </setting>
    </MyLibrary.My.MySettings>
</userSettings>

1 个答案:

答案 0 :(得分:1)

我建议查看.NET的XML序列化内容。它工作得很好,我几乎用于所有设置存储的东西。

基本上,创建一个将存储您的设置的类,确保它有一个不带参数的构造函数。

public class Settings
{
    public Settings() { }

    public string MySetting { get; set; }
}

然后从您的应用程序中,使用这样的函数将其序列化为XML文件:

public static string Serialize<T>(T item) where T:class
{
    try
    {
        XmlSerializer serial = new XmlSerializer(typeof(T));
        StringBuilder sb = new StringBuilder();
        StringWriter writer = new StringWriter(sb);
        serial.Serialize(writer, item);
        writer.Close();
        return sb.ToString();
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Failed to serialize object of type " + typeof(T).FullName + ": " + ex.Message);
        return "Failed to serialize";
    }
}

和这样的函数将XML文件反序列化到您的设置类中:

public static T Deserialize<T>(string FilePath) where T : class
{
    try
    {
        XmlSerializer xml = new XmlSerializer(typeof(T));
        FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
        XmlSerializer xml = new XmlSerializer(typeof(T));
                T res = (T)xml.Deserialize(fs);
        fs.Close();
        return res;
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Failed to deserialize object of type " + typeof(T).FullName + ": " + ex.Message);
        return default(T);
    }
}
祝你好运,并希望它可以帮助你