Мне удалось легко сгенерировать XML-файл из нескольких классов, как показано ниже;десериализация XML правильно в классы
public class AllConfig : XMLEncapsulator
{
[XmlElement("Database-Settings")]
public DataBaseConfiguration databaseConfiguration { get; set; }
[XmlElement("Merlin-Settings")]
public MerlinConfiguration merlinConfiguration { get; set; }
}
public class DataBaseConfiguration : XMLEncapsulator
{
public string dbIP { get; set; }
public int ?port { get; set; }
public string username { get; set; }
public string password { get; set; }
}
public class MerlinConfiguration : XMLEncapsulator
{
public string MerlinIP { get; set; }
public int ?MerlinPort { get; set; }
public int ?RecievingPort { get; set; }
}
// load classes with information, then;
try
{
allConfig.databaseConfiguration = dbConfig;
allConfig.merlinConfiguration = merlinConfig;
allConfig.Save();
}
catch (Exception ErrorFinalisingSave)
{
MessageBox.Show(ErrorFinalisingSave.Message + "3");
}
Это прекрасно работает и дает мне:
<AllConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<databaseConfiguration>
<dbIP></dbIP>
<port></port>
<username></username>
<password></password>
</databaseConfiguration>
<merlinConfiguration>
<MerlinIP></MerlinIP>
<MerlinPort></MerlinPort>
<RecievingPort></RecievingPort>
</merlinConfiguration>
</AllConfig>
Однако, как я идти о получении этого обратно в мои формы? поэтому у меня есть что-то вроде этого, но я не могу заставить его работать;
AllConfig allConfig;
DataBaseConfiguration dbConfig;
MerlinConfiguration merlinConfig;
//need to load here.
//check if values loaded are null, and then load them if they exist into textboxes and such.
Следует ли загружать два класса конфигурации и назначать их в общий класс конфигурации? или мне нужно загрузить общий класс и назначить классы sub-config, например;
allConfig = new AllConfig();
dbConfig = new DataBaseConfiguration();
merlinConfig = new MerlinConfiguration();
allConfig.databaseConfiguration = dbConfig;
allConfig.merlinConfiguration = merlinConfig;
allConfig.databaseConfiguration.Load();
allConfig.merlinConfiguration.Load();
изменить: heres мой метод загрузки;
public virtual void Load()
{
if (File.Exists(DeviceManager.path))
{
StreamReader sr = new StreamReader(DeviceManager.path);
XmlTextReader xr = new XmlTextReader(sr);
XmlSerializer xs = new XmlSerializer(this.GetType());
object c;
if (xs.CanDeserialize(xr))
{
c = xs.Deserialize(xr);
Type t = this.GetType();
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo p in properties)
{
p.SetValue(this, p.GetValue(c, null), null);
}
}
xr.Close();
sr.Close();
}
}
Вы спрашиваете, как вы десериализации XML в свой объект? – Kane
Думаю, да, да. edit: у меня уже есть .load() для загрузки, я просто не знаю, какой заказ их загрузить. Имеет ли это смысл? –
Что такое '' XMLEncapsulator'? Пожалуйста, покажите нам код, который вы используете для сериализации объекта. Не похоже, что вы используете XmlSerializer напрямую. В противном случае результирующий xml будет иметь элементы «Database-Settings» и «Merlin-Settings» в качестве элементов. – harlam357