сериализация в XML-путь - PullRequest
       12

сериализация в XML-путь

1 голос
/ 11 февраля 2012

Я пытаюсь сериализовать информацию о моем классе отчета в XML.На данный момент я думаю, что весь код сериализации и десериализации работает, но при начальной записи у меня возникают проблемы при выполнении сериализации, потому что XML-файл еще не существует.

для пустого текстового файла, я могу использовать:

StreamWriter sw = File.CreateText(@"path");
sw.Close();

это мой блок кода для сериализации.исключение (Directory not found) вызывается в строке StreamWriter.Я хотел бы просто добавить if(!File.Exists(xmlPath))...create empty XML.Или, может быть, есть более правильный способ сделать это.

public void SerializeToXML(Report newReport)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Report));
            TextWriter textWriter = new StreamWriter(xmlPath);
            serializer.Serialize(textWriter, newReport);
            textWriter.Close();
        }

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

Конструктор StreamWriter(String) создаст файл, если он еще не существует:

Если файл существует, он перезаписывается; в противном случае создается новый файл.

Однако он не создаст никаких несуществующих каталогов на вашем пути.

DirectoryNotFoundException: указанный путь недопустим, например, он находится на неподключенном диске.

Чтобы создать любые необходимые каталоги, вы можете включить следующий код (в начале вашего SerializeToXML метода):

var dir = Path.GetDirectoryName(xmlPath);
if (!Directory.Exists(dir))
    Directory.CreateDirectory(dir);
1 голос
/ 11 февраля 2012

Сначала убедитесь, что каталог существует, вы можете использовать:

Directory.CreateDirectory(@"c:\directory\subdirectory");

Вы не должны проверять, существует ли каталог.

Простой способ преобразовать публичные классы в XML - использовать следующий фрагмент:

public static string ToXml<T>(T obj)
{
   using (var ms = new MemoryStream())
   using (var sr = new StreamReader(ms))
   {
       var xmlSer = new XmlSerializer(typeof(T));
       xmlSer.Serialize(ms, obj);
       ms.Seek(0, SeekOrigin.Begin);
       return sr.ReadToEnd();
   }
}

Тогда вы можете просто использовать следующий код для записи в файл:

  var xmlString = Util.ToXml(report);
  File.WriteAllText(@"path", xmlString);

(этот пример без обработки ошибок)

Кроме того, в вашем коде вы забыли закрыть / удалить TextWriter. Я бы порекомендовал использовать оператор using для вас.

0 голосов
/ 11 февраля 2012

CreateText и StreamWriter будут создавать файлы, если они не существуют, но они не будут создавать каталоги, которые еще не существуют для вас. Ваш путь правильный?

Попробуйте проверить с помощью Directory.Exists (Path.GetDirectoryName (xmlPath)).

...