加载XML文档会加载同一组两次

时间:2017-02-22 11:25:38

标签: c# .net xml list xmlserializer

要开始的一些课程,我将它们全部写完,以便您可以重现我的问题:

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类的两个实现,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));
    }
}

最后是主要课程:

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个权限。

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

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

但是,使用PCMS2Con对象是1个用户,具有4(4)个权限。它使该领域翻倍(它基本上是p1,p2,p1,p2)。放置BP以在Load()之后看到Con。

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

1 个答案:

答案 0 :(得分:2)

您在PMCS2的构造函数中创建权限对象,您也在PMCS1的构造函数中创建了权限对象,但是您确实有两个属性将被序列化程序覆盖。 如果PMCS2,您的构造函数会向List添加两个项目,而序列化程序会将已保存的项目添加到同一列表中。

我不确切知道你的用例,但我建议将权限的init移到分离的方法:

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();
}