Некоторые классы, чтобы начать, я пишу их все, так что вы можете воспроизвести мою проблему:Загрузка XML документа загружает ту же группу дважды
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();
}
}
}
Теперь, используя либо PCMS1
или PCMS2
, файл конфигурации генерируется должным образом - один пользователь с двумя правами доступа.
Однако, когда файл конфигурации присутствует, вызов Con = Config.Load()
в основном классе дает разные результаты.
Использование PCMS1
, Con
объект как и ожидалось - 1 пользователь с двумя правами доступа.
Однако, используя PCMS2
, объект Con
является 1 пользователем с 4 (четырьмя) разрешениями. Он удваивает это поле (это в основном p1, p2, p1, p2). Положите BP, чтобы увидеть Con после Load()
.
Я предполагаю, что список (PCMS2
) воплощения делает что-то неуловимое во время загрузки, о котором я не знаю, но я не могу найти проблему.
Это похоже на создание пустого списка разрешений при запуске его для создания файла конфигурации. – Janushoff
@ Janushoff извините, пропустили ваш код, я обновил ответ с нужным местом для вызова init –
Да, теперь это работает правильно, тем не менее, у меня все еще есть некоторые трудности, почему это не сработало в первую очередь. – Janushoff