2017-02-22 6 views
1

Некоторые классы, чтобы начать, я пишу их все, так что вы можете воспроизвести мою проблему:Загрузка 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) воплощения делает что-то неуловимое во время загрузки, о котором я не знаю, но я не могу найти проблему.

ответ

2

Вы создаете свои объекты разрешений в конструкторе PMCS2, вы делаете это и в конструкторе PMCS1, но там у вас есть два свойства, которые будут перезаписаны сериализатором. В случае PMCS2 ваш конструктор добавляет два элемента в список, а сериализатор добавляет элементы, которые он дезертировал в тот же список.

Я не знаю точно ваш USECASE но я хотел бы предложить, чтобы переместить инициализации из разрешений отделенной метода:

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

Это похоже на создание пустого списка разрешений при запуске его для создания файла конфигурации. – Janushoff

+0

@ Janushoff извините, пропустили ваш код, я обновил ответ с нужным местом для вызова init –

+0

Да, теперь это работает правильно, тем не менее, у меня все еще есть некоторые трудности, почему это не сработало в первую очередь. – Janushoff

Смежные вопросы