Как сохранить коллекции интерфейсов в xml в wpf - PullRequest
0 голосов
/ 28 августа 2018

У меня есть модель с интерфейсом коллекции. Я хочу сохранить коллекцию в XML-файле во время выполнения во временном местоположении. Без набора интерфейсов модель корректно сохраняется в XML-файле. Но коллекция интерфейсов не сохраняется в XML-файле. Пожалуйста, кто-нибудь, помогите мне достичь этого. Структура класса Моя модель упоминается ниже,

MainWindowModel

public class MainWindowModel
{           
    private string header;  
    public string Header
    {
      get { return header; }
      set { header = value; }
    }

    private bool isEditing = false;
    public bool IsEditing
    {
      get { return isEditing; }
      set { isEditing = value; }
    }

    public ObservableCollection<Details> DetailsCollection { get; set; }
}

Детали

public class Details
{              
   public string Key { get; set; }          
   public ObservableCollection<IValue> Values { get; set; }
}

IVALUE

public interface IValue
{
    int Id { get; set; }
    string Name { get; set; }
}

FileReaderWriter

public class FileReaderWriter<T>
{
   public string FileLocation;

   public T Fetch()
   {
      if (File.Exists(FileLocation))
      {
         XmlSerializer deserializer = new XmlSerializer(typeof(T));
         TextReader reader = new StreamReader(FileLocation);
         object obj = deserializer.Deserialize(reader);
         T XmlData = (T)obj;
         reader.Close();
         return XmlData;
       }
       return default(T);
    }

    public virtual string GetFileLocation()
    {
       return FileLocation;
    }

    public void Save(T model)
    {
       XmlSerializer serializer = new XmlSerializer(typeof(T));
       var directory = Path.GetDirectoryName(FileLocation);
       if (!string.IsNullOrEmpty(directory))
       {
         if (!Directory.Exists(directory))
             Directory.CreateDirectory(directory);
             using (var writer = XmlWriter.Create(FileLocation))
             {
                 serializer.Serialize(writer, model);
             }
        }
    }
}

ReaderWriterClass

    public class DetailsViewReaderWriter : FileReaderWriter<ObservableCollection<MainWindowModel>>
    {
        public DetailsViewReaderWriter()
        {
            FileLocation = ConfigurationManager.AppSettings["RecentFileLocation"];
        }
        public ObservableCollection<MainWindowModel> FetchFile()
        {
            var recentFile = Fetch();
            return recentFile;
        }
        public override string GetFileLocation()
        {
            return FileLocation;
        }
        public void SaveFile(ObservableCollection<MainWindowModel> fileModel)
        {
            Save(fileModel);
        }
    }

App.config

<appSettings>
  <add key="RecentFileLocation" value="D:\MyProject\RecentDetails.xml"/>
</appSettings>

1 Ответ

0 голосов
/ 28 августа 2018

XmlSerializer не может сериализовать типы интерфейсов. Что вы можете сделать, это реализовать интерфейс IXmlSerializable. Пожалуйста, найдите ниже грубый! пример. Это не проверено. Вы должны внимательно прочитать, как правильно реализовать интерфейс IXmlSerializable. Но чтобы дать вам идею и помочь начать:

Настройте ваш IValue интерфейс:

public interface IValue: IXmlSerializable
{
    int Id { get; set; }
    string Name { get; set; }
}

Реализация интерфейса:

public class Value : IValue
{
    public int Id { get; set; }
    public string Name { get; set; }

    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader)
    {
        reader.MoveToContent();
        Name = reader.GetAttribute("Name");
        Id = int.Parse(reader.GetAttribute("Id"));
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Id", Id.ToString());
        writer.WriteAttributeString("Name", Name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...