Как бы вы представили этот XML в объекте? - PullRequest
1 голос
/ 23 февраля 2009
<FileTransferSettings>
  <UploadPath src="user">C:\uploads</UploadPath>
  <DownloadPath src="app">C:\downloads</DownloadPath>
</FileTransferSettings>

Я бы хотел десериализовать этот XML в объект FileTransferSettings с 2 свойствами - UploadPath и DownloadPath. Но я также хочу сохранить атрибут src для каждого свойства таким образом, чтобы мой код мог его запрашивать.

Я думаю, что создание связанных свойств UploadPathSrc и DownloadPathSrc немного неудобно и громоздко.

Есть ли другой способ представить это в .NET? Мне атрибут src кажется, что его следует рассматривать как метаданные. Есть ли лучшая практика для этого?

(Для справки по почему я пытаюсь это сделать - см. Мой предыдущий вопрос ).

Спасибо.

Ответы [ 3 ]

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

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

[XmlRoot("FileTransferSettings")]
public class FileTransferSettings
{
   [XmlElement("DownloadPath")]
   public DownloadPath DownloadPath { get; set; }
   // ...
}

[XmlType("DownloadPath")]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src; // or use enum etc
  [XmlText]
  public string Text;
}

// the serialized XML looks like
<FileTransferSettings>
   <DownloadPath Src="...">text</DownloadPath>
   ....
</FileTransferSettings>
3 голосов
/ 23 февраля 2009

Чтобы расширить общую идею от Даниэля Л.

public Class FileTransferPath
{
  public Enum SourceEnum { User, App }

  public SourceEnum Source { get; set; }  //Automatic properties in 3.5 Syntax
  public string FilePath { get; set; }
}

public Class FileTransferSettings
{
  public FileTransferPath UploadPath { get; set; }
  public FileTransferPath DownLoadPath { get; set; }
}
3 голосов
/ 23 февраля 2009

Вы можете создать второй класс, FileTransferPath, который имеет строковое значение «Путь» и значение перечисления «Источник»

class FileTransferSettings
{
   public FileTransferPath UploadPath { get; set; }
   public FileTransferPath DownloadPath { get; set; }
   // ...
}

class FileTransferPath
{
   public string Path { get; set; }
   public FileTransferSource Source { get; set}

   public enum FileTransferSource
   {
     None,
     User,
     Application,
     // ...
   }
}

Тогда вы можете использовать код как

   obj.UploadPath.Path;
   obj.UploadPath.Source;

Там могут быть лучшие имена, которые вы можете выбрать для свойств класса; Я не знаю, что мне нравится повторение Пути. obj.Upload.Path или что-то может быть лучше.

Обратите внимание, что вы не сможете напрямую сериализовать / десериализовать это напрямую в формат, который вы используете, используя XmlSerialization; но он выполняет то, что вам нужно. (И вы все еще можете сериализовать в XML, вам просто нужно сделать немного больше работы)

...