C# десериализация класса - значение переменной по умолчанию - PullRequest
0 голосов
/ 05 августа 2020

Я сохраняю локальные пользовательские настройки в файл xml. Программа содержит класс «Настройки», который сериализуется при закрытии программы и десериализуется при ее следующем запуске. Но проблема в том, что программа все время меняется, и при создании следующей версии я хочу, чтобы пользовательские настройки сохранялись. Но программа может содержать новые поля настроек, и тогда программа запустится и десериализует старый файл xml - новые поля будут нулевыми. Теперь я проверяю все поля как жесткий код в программе, например:

Settings sts = (Settings)Deserialise(path);
if(sts.Field2 == null) sts.Field2 = "defaultvalue2";
if(sts.Field3 == null) sts.Field3 = "defaultvalue3";

Конечно, меня это не устраивает. Можно ли сделать значение переменной "по умолчанию" одновременно с изменением кода класса настроек? Как это:

class Settings 
{
   public string Field1 (DefaultValue: "defaultvalue1");
   public string Field2 (DefaultValue: "defaultvalue2");
}
public void Main
{
   Settings sts = (Settings)Deserialise(path);
   foreach(var fld in typeof(sts))
   {
      if(fld.Value == null)
          fld.Value = Settings.Fields[fld].DefaulValue;
   }
}

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Да, это возможно, просто используйте стандартный способ установки стандартных значений:

class Settings 
{
   public string Field1 = "defaultvalue1";
   public string Field2 = "defaultvalue2";
}
public void Main
{
   Settings sts = (Settings)Deserialise(path);
   /* not needed
   foreach(var fld in typeof(sts))
   {
      if(fld.Value == null)
          fld.Value = Settings.Fields[fld].DefaulValue;
   }*/
}
0 голосов
/ 05 августа 2020

Файл Settings.settings xml был разработан для стандартных c настроек проекта и, используя пользовательские настройки, может быть сохранен во время выполнения. Вы меняете настройки так сильно, что у них больше нет «старых» значений или просто добавляете в список настроек?

Если просто добавляете, вам не нужно l oop через настройки один по одному и попытайтесь угадать их типы со значениями, так как вы можете просто сделать это:

int myInteger = Properties.Settings.Default.MyIntegerSettingValue;

И записать в файл настроек:

Properties.Settings.Default.MyIntegerSettingValue = myInteger;

Итак, если вы не можете заменить свои настройки. xml файл, я предлагаю смоделировать ваши настройки в классе, который содержит все ваши настройки, загруженные во время выполнения, и для каждого из них просто запишите его в файл настроек со своим значением по умолчанию:

Properties.Settings.Default.MyMissingSetting = "MyDefaultValue"

Вы можете найти полезную информацию об использовании настроек приложения здесь

0 голосов
/ 05 августа 2020

https://docs.microsoft.com/zh-tw/dotnet/api/system.xml.serialization.xmlattributes.xmldefaultvalue?view=netcore-3.1

вот и погуглил. может попробовать? Использовать атрибут по умолчанию: DefaultValueAttribute

public class Pet
{
   // The default value for the Animal field is "Dog".
   [DefaultValueAttribute("Dog")]
   public string Animal ;
}
...