#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
. (На самом деле в моей идее я буду использовать пользовательский сериализатор)