正在加载 XML 文档两次加载同一组

Loading XML document loads the same group twice

一些 class 开始,我正在写下它们以便您可以重现我的问题:

public class PermissionObject
{
    public string permissionName;
    public string permissionObject;
    public bool permissionGranted;

    public PermissionObject()
    {
        permissionName = "";
        permissionObject = "";
        permissionGranted = true;
    }

    public PermissionObject(string name, string obj, bool granted)
    {
        permissionName = name;
        permissionObject = obj;
        permissionGranted = granted;
    }
}

public class Config
{
    public string cmsDataPath = "";
    public string cmsIP = "";
    public List<UserClass> usersCMS = new List<UserClass>();
    static public string pathToConfig = @"E:\testconpcms.xml";
    public string cardServerAddress = "";

    public void Save()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Config));
        using (Stream fileStream = new FileStream(pathToConfig, FileMode.Create))
        {
            serializer.Serialize(fileStream, this);
        }
    }

    public static Config Load()
    {
        if (File.Exists(pathToConfig))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Config));
            try
            {
                using (Stream fileStream = new FileStream(pathToConfig, FileMode.Open))
                {
                    return (Config)serializer.Deserialize(fileStream);
                }
            }
            catch (Exception ex)
            {
                return new Config();
            }
        }
        else
        {
            return null;
        }
    }
}

public class UserClass
{
    public string Name;
    public string Login;
    public string Password;
    public PCMS2 PermissionsList; // OR new PCMS1, as I will explain in a bit

    public UserClass()
    {
        this.Name = "Admin";
        this.Login = "61-64-6D-69-6E";
        this.Password = "61-64-6D-69-6E";
        this.PermissionsList = new PCMS2(); // OR new PCMS1, as I will explain in a bit

    }
}

问题点:考虑 PCMS class、PCMS1 和 PCMS2 的两种实现:

public class PCMS1
{
    public PermissionObject p1, p2;

    public PCMS1()
    {
        p1 = new PermissionObject("ImportConfigCMS", "tsmiImportCMSConfigFile", true);
        p2 = new PermissionObject("ExportConfigCMS", "tsmiExportCMSConfigFile", true);
    }
}

public class PCMS2
{
    public List<PermissionObject> listOfPermissions = new List<PermissionObject>();

    public PCMS2()
    {
        listOfPermissions.Add(new PermissionObject("ImportConfigCMS", "tsmiImportCMSConfigFile", true));
        listOfPermissions.Add(new PermissionObject("ExportConfigCMS", "tsmiExportCMSConfigFile", true));
    }
}

最后是 main class:

public partial class Form1 : Form
{
    private Config Con;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Con = Config.Load();
        if (Con == null)
        {
            Con = new Config();
            Con.cmsDataPath = @"E:\testconpcms.xml";
            Con.Save();
        }
        if (Con.usersCMS.Count == 0)
        {
            UserClass adminDefault = new UserClass();
            Con.usersCMS.Add(adminDefault);
            Con.Save();
        }
    }
}

现在,使用 PCMS1PCMS2,配置文件正确生成 - 一个用户具有 2 个权限。

但是,当存在配置文件时,在主 class 中调用 Con = Config.Load() 会给出不同的结果。

使用 PCMS1Con 对象符合预期 - 1 个用户具有 2 个权限。

但是,使用 PCMS2Con 对象是具有 4(四)个权限的 1 个用户。它使该字段加倍(基本上是 p1、p2、p1、p2)。在Load().

后放个BP看Con

我猜列表 (PCMS2) 实现在加载期间做了一些我不知道的不稳定的事情,但我似乎找不到问题所在。

您在 PMCS2 的构造函数中创建了您的权限对象,您也在 PMCS1 的构造函数中创建了它,但是您确实有两个属性将被序列化程序覆盖。 在 PMCS2 的情况下,您的构造函数将两个项目添加到 List 中,然后序列化程序将其反序列化的项目添加到同一列表中。

我不完全了解你的用例,但我建议将权限的初始化移动到分离方法:

public class PCMS1
{
    public PermissionObject p1, p2;

    public void Init()
    {
        p1 = new PermissionObject("ImportConfigCMS", "tsmiImportCMSConfigFile", true);
        p2 = new PermissionObject("ExportConfigCMS", "tsmiExportCMSConfigFile", true);
    }
}

public class PCMS2
{
    public List<PermissionObject> listOfPermissions = new List<PermissionObject>();

    public void Init()
    {
        listOfPermissions.Add(new PermissionObject("ImportConfigCMS", "tsmiImportCMSConfigFile", true));
        listOfPermissions.Add(new PermissionObject("ExportConfigCMS", "tsmiExportCMSConfigFile", true));
    }
}

之后你可以调用它,如果你想获得初始设置:

if (Con.usersCMS.Count == 0)
{
    UserClass adminDefault = new UserClass();
    adminDefault.PermissionsList.Init();
    Con.usersCMS.Add(adminDefault);
    Con.Save();
}