Visual Studio 设置不起作用

Visual Studio settings doesn't work

我有一个简单的 WPF 应用程序,允许用户管理他们的员工。用户可以添加、删除和编辑工人。我想在重新启动应用程序后记住用户和他们的工作人员,所以我想我需要使用 Visual Studio 设置(我的意思是 Settings.settings 文件和 Settings class)。 我的应用程序显示登录名 window,用户写入登录名和密码,主 window 显示允许查看和控制用户的工作人员。 当用户登录时,我想加载他的工作人员列表,在他注销后,我想保存修改后的列表。 我创建了一个名为 AllUsers 的设置,类型为 UserCollection。这是这个简单的 class 和 User class:

的代码
public class UserCollection
{
    public UserCollection(IEnumerable<User> users = null)
    {
        Users=new List<User>(users ?? new List<User>());
    }
    public List<User> Users;
}

public class User
{
    public string Login { get; }
    public string Password { get; }
    public ObservableCollection<Worker> Workers { get; set; } 

    public User(string login, string password)
    {
        Login = login;
        Password = password;
        Workers=new ObservableCollection<Worker>();
    }
}

然后我写了一个 class PropertiesManager 来管理设置、更新和保存它们。这是代码:

public static class PropertiesManager
{
    public static List<User> Users
    {
        get
        {
            if (Settings.Default.AllUsers == null)
            {
                Settings.Default.AllUsers=new UserCollection();
                Settings.Default.Save();
            }
            return Settings.Default.AllUsers.Users;
        }
        set
        {
            Settings.Default.AllUsers.Users = value;
            Settings.Default.Save();
        }
    } 
    public static User VerifyUser(string login, string password)
    {
        User current = Users.FirstOrDefault(x => x.Login.Equals(login));
        if (current == null)
        {
            current=new User(login,password);
            Users.Add(current);
            SaveUser();
        }
        return current;
    }

    public static void SaveUser()
    {
        Settings.Default.Save();
    }
}

我也认为 Settings.settings 文件可能有用:

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01  /settings" CurrentProfile="(Default)" GeneratedClassNamespace="HRManger.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
    <Setting Name="AllUsers" Type="HRManger.UserCollection" Scope="User">
        <Value Profile="(Default)" />
    </Setting>
</Settings>
</SettingsFile>

我注意到,当我以 user1 身份登录时添加一些工人并注销,然后以 user2 的身份执行相同操作并再次以 user1 身份登录时,他的工人可以正常显示。但是,当我重新启动应用程序时,我将丢失所有内容。 我不知道我做错了什么。我是不是忘记了什么重要的事情?

我找到了设置未正确保存和恢复的原因,所以我 post 回答了这个问题。要理解为什么会发生这种情况,为什么必须了解 Visual Studio settings 是如何工作的。众所周知,它很常见 XML serialization 所以它有一些要求。

只有非静态和非只读字段和属性被序列化,我们必须在 class 中有非参数化的默认构造函数以确保此 class 可以序列化为 XML。所以,在这个问题中我们想要序列化 ​​User 对象的集合,所以泛型类型(在本例中 User)必须有一个非参数化的构造函数。这是不起作用的主要原因。