Сериализация XML имеет много движущихся частей, которые вы должны получить правильно.Я предлагаю читать онлайн на C # жемчужинах на других ресурсах о том, как это сделать.
Я сделал пример приложения, которое читает XML-файл из MyDocuments
и отображает данные, а также записывает данные, когдаформа закрывается.
![scr1](https://i.stack.imgur.com/tUGn7.png)
Код, который считывает и записывает все данные:
public class SampleData
{
public SampleData()
{
this.Cells = new List<CellModel>();
}
public SampleData(params CellModel[] data) : this()
{
this.Cells.AddRange(data);
}
[XmlArrayItem("Cell")]
public List<CellModel> Cells { get; set; }
public string ToXml()
{
var ms = new System.IO.StringWriter();
var settings = new XmlWriterSettings()
{
OmitXmlDeclaration = true,
Indent = true,
CloseOutput = true,
NewLineOnAttributes = false,
};
var fs = XmlWriter.Create(ms, settings);
var tool = new XmlSerializer(typeof(SampleData));
tool.Serialize(fs, this);
fs.Close();
return ms.ToString();
}
public static SampleData FromXml(string xml)
{
var ms = new StringReader(xml);
var fs = XmlReader.Create(ms);
var tool = new XmlSerializer(typeof(SampleData));
var data = tool.Deserialize(fs) as SampleData;
return data;
}
}
public struct CellModel
{
public string CellName { get; set; }
public double CellAh { get; set; }
public double CellNominalVoltage { get; set; }
public double CellInternalResistance { get; set; }
public double CylDeg05C25D { get; set; }
public double CylDeg10C25D { get; set; }
public double CylDeg20C25D { get; set; }
public double CylDeg05C35D { get; set; }
public double CylDeg10C35D { get; set; }
public double CylDeg20C35D { get; set; }
public double CylDeg05C45D { get; set; }
public double CylDeg10C45D { get; set; }
public double CylDeg20C45D { get; set; }
public double CalDeg1stY25D { get; set; }
public double CalDeg2ndY25D { get; set; }
public double CalDeg3rdY25D { get; set; }
public double CalDeg1stY35D { get; set; }
public double CalDeg2ndY35D { get; set; }
public double CalDeg3rdY35D { get; set; }
public double CalDeg1stY45D { get; set; }
public double CalDeg2ndY45D { get; set; }
public double CalDeg3rdY45D { get; set; }
}
Сгенерированный XML-файл выглядит следующим образомthis:
<SampleData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Cells>
<Cell>
<CellName>SampleCell</CellName>
<CellAh>2600</CellAh>
<CellNominalVoltage>12</CellNominalVoltage>
<CellInternalResistance>0.055</CellInternalResistance>
<CylDeg05C25D>0.72634</CylDeg05C25D>
<CylDeg10C25D>0.38927</CylDeg10C25D>
<CylDeg20C25D>0.42383</CylDeg20C25D>
<CylDeg05C35D>0.22634</CylDeg05C35D>
<CylDeg10C35D>0.58927</CylDeg10C35D>
<CylDeg20C35D>0.23831</CylDeg20C35D>
<CylDeg05C45D>0.26342</CylDeg05C45D>
<CylDeg10C45D>0.89275</CylDeg10C45D>
<CylDeg20C45D>0.23831</CylDeg20C45D>
<CalDeg1stY25D>0.92834</CalDeg1stY25D>
<CalDeg2ndY25D>0.28345</CalDeg2ndY25D>
<CalDeg3rdY25D>0.83443</CalDeg3rdY25D>
<CalDeg1stY35D>0.29834</CalDeg1stY35D>
<CalDeg2ndY35D>0.82345</CalDeg2ndY35D>
<CalDeg3rdY35D>0.38443</CalDeg3rdY35D>
<CalDeg1stY45D>0.39284</CalDeg1stY45D>
<CalDeg2ndY45D>0.42835</CalDeg2ndY45D>
<CalDeg3rdY45D>0.48343</CalDeg3rdY45D>
</Cell>
</Cells>
</SampleData>
Чтобы все это работало, вам нужно иметь свои данные в свойствах с геттерами и сеттерами, и вам нужен конструктор без параметров в классе, который содержит все данные.
Я использовал привязку данных в своей форме, и код, который читает при загрузке и пишет при закрытии,
public string DataPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "UserData.xml");
public CellModel Current
{
get => (CellModel)cellModelBindingSource.Current;
}
protected override void OnLoad(EventArgs e)
{
if(File.Exists(DataPath))
{
var xml = File.ReadAllText(DataPath);
var sample = SampleData.FromXml(xml);
this.cellModelBindingSource.DataSource = sample.Cells;
MessageBox.Show($"Data read from {DataPath}");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
var data = this.cellModelBindingSource.DataSource as DataModel[]
var sample = new SampleData(data);
File.WriteAllText(this.DataPath, sample.ToXml());
MessageBox.Show($"Data written to {DataPath}");
}