2012-02-10 2 views
0

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

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

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(); 
     } 

ответ

2

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

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

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

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

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

var dir = Path.GetDirectoryName(xmlPath); 
if (!Directory.Exists(dir)) 
    Directory.CreateDirectory(dir); 
+0

yup знал, что это было просто благодаря кучке. – ikathegreat

+1

Хороший ответ, но вам действительно не нужно проверять с помощью 'Directory.Exists()' перед созданием. 'CreateDirectory()', делает это для вас. – MatteKarla

+0

@MatteKarla: Не совсем ... Да, 'CreateDirectory' проверяет, существует ли каталог, но он не делает этого с помощью вызова« Exists ». Реализация, которую он использует, на самом деле, немного медленнее, чем «Exists». – Douglas

0

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

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

+0

или даже лучше: 'Directory.CreateDirectory (Path.GetDirectoryName (xmlPath)) ', который решает проблему, если каталог не существует, как в случае с икатегером. – MatteKarla

1

Во-первых, чтобы убедиться, что каталог существует, вы можете использовать:

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. Я бы порекомендовал использовать инструкцию use для ее обработки.