Есть ли хорошее решение для сохранения состояния с информацией о версии (из-за разных выпущенных приложений могут быть некоторые изменения в объекте состояния)

#c# #version #state #xmlserializer #xml-deserialization

#c# #версия #состояние #xmlserializer #xml-десериализация

Вопрос:

Я хочу сохранить состояние проекта на диске и восстановить его состояние при повторном открытии проекта в следующий раз.

например. существует ViewState класс для состояния

 //Version 1:
class ViewState
{
 public string ID{get;set;}
 public string CheckedSomeState{get;set;}
 public string ToRemoved{get;set;}// will removed in version2
 public string ToRenamed{get;set;}// will renamed in version2
}

//Version 2:
class ViewState
{
 public string ID{get;set;}
 public string CheckedSomeState{get;set;}
 public string NewStateVersion2{get;set;}//new in version2
 public string ToRenamedNewNameVersion2{get;set;}
}

//Version 3:
...
 

Вопрос:
Я хочу преобразовать ViewState его в XML-файл с помощью XML-сериализатора.
обратная совместимость при изменении ‘ViewState’.(Версия приложения 2 может открывать файл, созданный версией приложения 1)

У меня есть идея: использовать некоторые атрибуты для объекта ‘ViewState’, чтобы отметить изменения в новой версии, если есть какие-то изменения. и настройте xml-сериализатор для сохранения «состояния просмотра». например:

 //Version 2:
class ViewState
{
 public string ID{get;set;}
 public string CheckedSomeState{get;set;}

 [New]
 public string NewStateVersion2{get;set;}

 //[Removed]
 //public string ToRemoved{get;set;}

 [Rename(OldName="ToRenamed",NewName="ToRenamedNewNameVersion2")]
 public string ToRenamedNewNameVersion2{get;set;}
}
 

Есть ли другое хорошее решение для сценария?

Комментарии:

1. Я не думаю, что сохранение настроек на диске является хорошей идеей для веб-сайта, потому что он не очень хорошо масштабируется. Я бы посмотрел на использование asp.net профиль для сохранения настроек.

2. @KenTucker Я сохраняю состояние для клиента Winform, а не для веб-сайта. Я хочу сохранить некоторые состояния представлений в Winform. например, сохранить состояние dockpanel winform…

Ответ №1:

Вы также можете создать словарь или список атрибутов и добавить атрибуты сериализации XML, например:

 using System.Xml.Serialization;    

[XmlRootAttribute("ViewState")]
class ViewState
{
   [XmlAttribute("ID")
   public string ID { get; set; }

   [XmlArray("Attributes")]
   [XmlArrayItem("Attribute")]
   public List<Attribute> Attributes { get; set; }
}

[XmlRootAttribute("Attribute")]
class Attribute
{
   [XmlAttribute("Key")]
   public string Key { get; set; }

   [XmlAttribute("Value")]
   public string Value { get; set; }
}
 

И тогда у вас есть легкий доступ ко всем вашим атрибутам состояния.

Комментарии:

1. Я не думаю, что решение может разрешить обратную совместимость. когда я переименовываю свойство. старый объект состояния не может быть десериализован из-за XMLSerializer того, что класс объекта изменился и не может найти соответствующий тип XMLSerializer . (На самом деле в моей идее я буду использовать пользовательский сериализатор)