Сохранение и загрузка в файл List<T>Serialize Deserialize

420
10 августа 2017, 21:07

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

[XmlRoot(ElementName = "ArrayOfAllList")]
public class AllList
{
    [XmlElement(ElementName = "DdmPkgStateTable")]
    public List<DdmPkgStateTable> ListDdmPkgStateTable = new List<DdmPkgStateTable>();
    [XmlElement(ElementName = "DDMTable")]
    public List<DDMTable> ListDDMTable = new List<DDMTable>();
}
[XmlRoot(ElementName = "DdmPkgStateTable")]
public struct DdmPkgStateTable
{
    [XmlElement(ElementName = "pkgstate")]
    public string pkgstate { get; set; }
    [XmlElement(ElementName = "statedttm")]
    public DateTime statedttm { get; set; }
}
[XmlRoot(ElementName = "DDMTable")]
public struct DDMTable
{
    [XmlElement(ElementName = "table_id")]
    public int table_id { get; set; }
    [XmlElement(ElementName = "pkg_id")]
    public int pkg_id { get; set; }
    [XmlElement(ElementName = "table_code")]
    public int table_code { get; set; }
    [XmlElement(ElementName = "tablename")]
    public string tablename { get; set; }
    [XmlElement(ElementName = "startdttm")]
    public string startdttm { get; set; }
    [XmlElement(ElementName = "enddttm")]
    public string enddttm { get; set; }
}

Xaml:

<pre>
<?xml version="1.0"?>
<ArrayOfAllList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AllList>
    <DdmPkgStateTable>
      <pkgstate>TO_BE_DELIVERED</pkgstate>
      <statedttm>2017-03-07T02:38:08</statedttm>
    </DdmPkgStateTable>
    <DdmPkgStateTable>
      <pkgstate>DELIVERED_XX</pkgstate>
      <statedttm>2017-03-07T07:41:28</statedttm>
    </DdmPkgStateTable>
    <DDMTable>
      <table_id>5990105</table_id>
      <pkg_id>-1222254826</pkg_id>
      <table_code>1010</table_code>
      <tablename>X_SUBS_ATR_VALUES</tablename>
      <startdttm>20170625000000</startdttm>
      <enddttm>20170625235959</enddttm>
    </DDMTable>
    <DDMTable>
      <table_id>6129605</table_id>
      <pkg_id>-1222254826</pkg_id>
      <table_code>1010</table_code>
      <tablename>X_SUBS_ATR_VALUES</tablename>
      <startdttm>20170625000000</startdttm>
      <enddttm>20170625235959</enddttm>
    </DDMTable>
  </AllList>
  <AllList>
    <DdmPkgStateTable>
      <pkgstate>LOADED_TO_STG_ODS</pkgstate>
      <statedttm>2017-06-28T10:10:59</statedttm>
    </DdmPkgStateTable>
    <DdmPkgStateTable>
      <pkgstate>TO_BE_DELIVERED</pkgstate>
      <statedttm>2017-06-26T03:33:28</statedttm>
    </DdmPkgStateTable>
        <DDMTable>
      <table_id>352608</table_id>
      <pkg_id>809624076</pkg_id>
      <table_code>117</table_code>
      <tablename>VIRTUAL_PAYMENTS</tablename>
      <startdttm>20170205020518</startdttm>
      <enddttm>20170307020518</enddttm>
    </DDMTable>
    <DDMTable>
      <table_id>352619</table_id>
      <pkg_id>809624076</pkg_id>
      <table_code>1000</table_code>
      <tablename>V_RTK$RTPL_EKHD_SHPD</tablename>
      <startdttm>20170205020518</startdttm>
      <enddttm>20170307020518</enddttm>
    </DDMTable>
  </AllList>
  </ArrayOfAllList>
<code>

Сохраняю:

public void SerializeObject<T>(T serializableObject, string fileName)
    {
        if (serializableObject == null) { return; }
        try
        {
            XmlDocument xmlDocument = new XmlDocument();
            XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
            using (MemoryStream stream = new MemoryStream())
            {
                serializer.Serialize(stream, serializableObject);
                stream.Position = 0;
                xmlDocument.Load(stream);
                xmlDocument.Save(fileName);
                stream.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

Загружаю

public T DeSerializeObject<T>(string fileName)
    {
        if (string.IsNullOrEmpty(fileName)) { return default(T); }
        T objectOut = default(T);
        try
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(fileName);
            string xmlString = xmlDocument.OuterXml;
            using (StringReader read = new StringReader(xmlString))
            {
                Type outType = typeof(T);
                XmlSerializer serializer = new XmlSerializer(outType);
                using (XmlReader reader = new XmlTextReader(read))
                {
                    objectOut = (T)serializer.Deserialize(reader);
                    reader.Close();
                }
                read.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        return objectOut;
    }

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

Answer 1

Измените определение данных

[XmlRoot(ElementName = "ArrayOfAllList")]
public class AllList
{
//[XmlElement(ElementName = "DdmPkgStateTable")]
    [XmlArray("DdmPkgStateTable")]
    [XmlArrayItem("DdmPkgState")]
public List<DdmPkgStateTable> ListDdmPkgStateTable = new List<DdmPkgStateTable>();
//[XmlElement(ElementName = "DDMTable")]
    [XmlArray("DDMTable")]
    [XmlArrayItem("DDMTableItem")]
public List<DDMTable> ListDDMTable = new List<DDMTable>();
...
Answer 2

Не нужны все эти XmlDocument, MemoryStream, StringReader... Незачем гонять данные из объекта в объект. Пишем и читаем сразу в/из файловый поток:

public void SerializeObject<T>(T serializableObject, string fileName)
{
    if (serializableObject == null)
        return;
    try
    {
        var serializer = new XmlSerializer(serializableObject.GetType());
        using (var stream = new FileStream(fileName, FileMode.Create))
        {
            serializer.Serialize(stream, serializableObject);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
public T DeSerializeObject<T>(string fileName)
{
    if (string.IsNullOrEmpty(fileName))
        return default(T);
    T objectOut = default(T);
    try
    {
        using (var stream = new FileStream(fileName, FileMode.Open))
        {
            var serializer = new XmlSerializer(typeof(T));
            objectOut = (T)serializer.Deserialize(stream);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    return objectOut;
}
READ ALSO
Как установить индекс текущей строки в datagridview?

Как установить индекс текущей строки в datagridview?

Программно выделяю строку в гриде:

637
Как получить доступ к страницам navigationPage NavigationFrame

Как получить доступ к страницам navigationPage NavigationFrame

Используется Visual Studio 2015; Devexpress 171

367
Получение списка всех пользователей

Получение списка всех пользователей

Есть терминальный сервер нужно: 1Программно получить список всех пользователей запущенных на компьютере (как в диспетчере задач Windows) 2

313
Удаление разделов реестра в цикле

Удаление разделов реестра в цикле

Подскажите можно как-нибудь удалить разделы реестра используя List<string> ?

441