Иногда C# XmlSerializer Serialize (сохранить) неправильно, больше символов, чем ожидалось - PullRequest
1 голос
/ 08 января 2020

Обычно вы работаете с файлом, он работает хорошо, но иногда файл работает не так, как это .. (конец дополнительной части " ConfigSetting> "), то, что я сделал, это открыл, отредактировал и сохранил его .

<?xml version="1.0"?>
<SystemConfigSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" IsRuntime="true">
<ReportSchedulers>
<ReportScheduler ReportName="report1" FullreportName="report1" IsEnableAutosaveReport="true" Hour="14" Minute="50" Second="0" ReportSave="Daily" DayofWeek="Sunday" LastUpdate="0001-01-01T00:00:00" />
<ReportScheduler ReportName="report2" FullreportName="report2" IsEnableAutosaveReport="false" Hour="0" Minute="0" Second="0" ReportSave="Daily" DayofWeek="Sunday" LastUpdate="0001-01-01T00:00:00" />
<ReportScheduler ReportName="report3" FullreportName="report3" IsEnableAutosaveReport="false" Hour="0" Minute="0" Second="0" ReportSave="Daily" DayofWeek="Sunday" LastUpdate="0001-01-01T00:00:00" />
<ReportScheduler ReportName="report4" FullreportName="report4" IsEnableAutosaveReport="false" Hour="0" Minute="0" Second="0" ReportSave="Daily" DayofWeek="Sunday" LastUpdate="0001-01-01T00:00:00" />
<ReportScheduler ReportName="report5" FullreportName="report5" IsEnableAutosaveReport="false" Hour="0" Minute="0" Second="0" ReportSave="Daily" DayofWeek="Sunday" LastUpdate="0001-01-01T00:00:00" />
</ReportSchedulers>
</SystemConfigSetting>ConfigSetting>

Остальная часть верна, кроме окончания ConfigSetting> , и я пытаюсь удалить конечную дополнительную часть, и файл конфигурации можно будет десериализовать.

Ниже приведен мой код.

Сохранение конфигурации системы:

public static bool SaveSystemConfig(SystemConfigSetting systemConfig)
    {
        try
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(SystemConfigSetting));
            using (FileStream fs = new FileStream(CONFIGFILEPATH), FileMode.Open))
            {
                xmlSerializer.Serialize(fs, systemConfig);
                fs.Close();
            }
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

SystemConfigSetting:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace HZSpreadSheet.Model
{
    [Serializable]
    [XmlRoot]
    public class SystemConfigSetting
    {
        private bool isRuntime = false;
        private List<ReportScheduler> reportSchedulers = new List<ReportScheduler>();
        [XmlAttribute]
        public bool IsRuntime { get => isRuntime; set => isRuntime = value; }
        [XmlArray]
        [XmlArrayItem]
        public List<ReportScheduler> ReportSchedulers { get => reportSchedulers; set => reportSchedulers = value; }
    }
}

ReportScheduler:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace HZSpreadSheet.Model
{
    public enum ReportSaveFrequency
    {
        Daily = 0,
        Weekly = 1,
        Monthly = 2,
        Manually =3
    }
    public enum DayofWeek
    {
        Sunday = 0,
        Monday = 1,
        Tuesday = 2,
        Wednesday = 3,
        Thursday = 4,
        Friday = 5,
        Saturday = 6
    }
    [XmlRoot]
    public class ReportScheduler
    {
        private string abbr_reportName;
        private string fullreportName;
        private bool isEnableAutosaveReport = false;
        private int hour = 0;
        private int minute = 0;
        private int second =0;
        private DateTime lastUpdate;
        private DayofWeek dayofWeek;
        private ReportSaveFrequency reportSaveFrequency;

        [XmlAttribute]
        public string ReportName { get => abbr_reportName; set => abbr_reportName = value; }
        [XmlAttribute]
        public string FullreportName { get => fullreportName; set => fullreportName = value; }
        [XmlAttribute]
        public bool IsEnableAutosaveReport { get => isEnableAutosaveReport; set => isEnableAutosaveReport = value; }
        [XmlAttribute]
        public int Hour { get => hour; set => hour = value; }
        [XmlAttribute]
        public int Minute { get => minute; set => minute = value; }
        [XmlAttribute]
        public int Second { get => second; set => second = value; }
        [XmlAttribute]
        public ReportSaveFrequency ReportSaveFrequency { get => reportSaveFrequency; set => reportSaveFrequency = value; }
        [XmlAttribute]
        public DayofWeek DayofWeek { get => dayofWeek; set => dayofWeek = value; }
        [XmlAttribute]
        public DateTime LastUpdate { get => lastUpdate; set => lastUpdate = value; }
    }
}

1 Ответ

4 голосов
/ 08 января 2020

Это происходит, если перезаписать файл (или аналогичный поток) и перезаписать более длинный файл с более короткими данными без их усечения. Если вы открываете существующий файл для произвольного доступа с записью (FileMode.Open), предполагается, что вы собираетесь редактировать содержимое, но не предполагает, что вам нужны только новые биты. То, что вы видите, это дополнительные байты из старой полезной нагрузки, которые не удаляются автоматически. Есть два способа усечения:

  1. использовать FileMode.Create при открытии файла, что инициализирует файл как нулевую длину
  2. использование SetLength на Stream при Закончили писать, чтобы сказать ему новую длину - например stream.SetLength(stream.Position);
...