Сериализация / десериализация в / из нескольких файлов конфигурации XML - PullRequest
1 голос
/ 23 февраля 2009

У меня есть набор пользовательских классов управления конфигурацией XML в .NET.

В моем приложении есть две области конфигурации:

Пользователь : настройка применяется к пользователю независимо от того, в какую учетную запись он вошел. Хранится в файле конфигурации XML в каталоге пользователя.

Пользователь / учетная запись: настройка применяется к пользователю при входе в конкретную учетную запись. Хранится в файле конфигурации XML в каталоге пользователя в отдельном подкаталоге учетной записи.

Два XML-документа имеют одинаковую структуру и могут быть изменены вручную. Когда приложение запускается, я считываю конфигурацию XML из профиля пользователя и конфигурацию XML из каталога User / Account. Затем я объединяю два XML-документа в один XDocument, а затем десериализирую XML в объекты, смоделированные по разделам XDocument. Если присутствует настройка уровня пользователя / учетной записи, она должна переопределить настройку уровня пользователя. Пример:

Файл пользователя:

<FileSettings>
  <DownloadPath>C:\downloads</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
</FileSettings>

Файл пользователя / учетной записи для учетной записи XYZ:

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
</FileSettings>

Результат после слияния:

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
</FileSettings>

В приведенном выше примере объект FileSettings с 2 свойствами - DownloadPath и UploadPath будет создан из раздела.

Вот моя проблема: Я понятия не имею, из какого файла конфигурации (т.е. области) пришли DownloadPath и UploadPath. В результате, когда объект должен снова сериализоваться, он не знает, какие свойства в каком файле находятся.

Вопрос: Каков наилучший способ хранения «источника» в зависимости от свойства, чтобы я мог гарантировать, что параметр записывается в тот же файл конфигурации, из которого он был прочитан

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2009

Можно ли после слияния добавить источник значений каждого свойства?

<FileSettings>
  <DownloadPath>C:\newlocation\xyz\mystuff</DownloadPath>
  <UploadPath>C:\uploads</UploadPath>
  <DownloadPathSrc>xyz</DownloadPathSrc>
  <DownloadPathSrc>user</DownloadPathSrc>
</FileSettings>

Если это так, два свойства src могут быть десериализованы в ваш объект FileSettings, Перед сериализацией в файл вы можете создать новый объект FileSetting для каждого источника, БЕЗ установки свойства * src, по умолчанию пустая строка не будет сериализована XmlSerializer. С помощью свойства src вы знаете, к какому файлу относится объект, который вы хотите сериализовать.

EDIT, Если вы хотите добавить src в качестве атрибута элемента. это тоже было моей первоначальной мыслью, однако вам нужно создать класс для каждого свойства. например для свойства DownloadPath в классе FileSetting

[XmlType()]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src;   
  [XmlText]
  public string Text;
}
// serialize to
<DownloadPath Src="...">text</DownloadPath>
1 голос
/ 23 февраля 2009

Я бы предпочел добавить некоторые свойства в XML, как это:

<FileSettings>
   <DownloadPath src="Account">C:\newlocation\xyz\mystuff</DownloadPath>
   <UploadPath src="User">C:\uploads</UploadPath>
</FileSettings>

Проще реализовать разделительный слой контента.

...