2010-01-14 2 views
2

У меня есть следующий метод (см. Ниже), так как вы можете видеть, что он сериализует объект в XML-файл. Основная проблема, с которой я столкнулась, - это заставить эту функцию перезаписывать файл, если он существует. Я знаю, что сначала могу удалить файл, если он существует, но это также означает, что я могу вызвать некоторую ошибку в моем приложении. Поэтому я хочу, чтобы это все или ничего, переписать метод ...C# Сериализация файла, переписать, если существует

Вот функция, любые идеи о том, как это можно сделать?

/// <summary> 
    /// Serializes an object to an xml file. 
    /// </summary> 
    /// <param name="obj"> 
    /// The object to serialize. 
    /// </param> 
    /// <param name="type"> 
    /// The class type of the object being passed. 
    /// </param> 
    /// <param name="fileName"> 
    /// The filename where the object should be saved to. 
    /// </param> 
    /// <param name="xsltPath"> 
    /// Pass a null if not required. 
    /// </param> 
    public static void SerializeToXmlFile(object obj, Type type, string fileName, string xsltPath) 
    { 
     var ns = new XmlSerializerNamespaces(); 
     ns.Add(String.Empty, String.Empty); 
     var serializer = new XmlSerializer(type); 

     var settings = new XmlWriterSettings {Indent = true, IndentChars = "\t"}; 


     using (var w = XmlWriter.Create(fileName,settings)) 
     { 

      if (!String.IsNullOrEmpty(xsltPath)) 
      { 
       w.WriteProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"" + xsltPath + "\""); 

      } 
      serializer.Serialize(w, obj, ns); 
     } 
    } 

ответ

14

Используйте перегруженную версию XmlWriter.Create, которая принимает Stream вместо строки и использовать File.Create для создания/перезаписи файла:

using (var w = XmlWriter.Create(File.Create(fileName), settings)) 
... 
+0

Я думаю, это сработает - потрясающе! и ty –

0

Сделайте резервную копию файла назначения, если существует, если возникла ошибка, напишите файл.

+1

+1 это вариант. –

4
  1. Откройте файл с помощью File.open() с FileMode .Create, FileAccess.Write и FileShare.None.
  2. Передайте поток, возвращаемый из File.Open() в XmlWriter.Create().

-

FileStream stream = File.Open(filename, FileMode.Create, FileAccess.Write, FileShare.None); 
using (XmlWriter writer = XmlWriter.Create(stream)) 
{ 
    ... 
} 
0

Вы можете сохранить новый файл XML во временном файле:

./directory/myNewObject.xml.temp

переименовать myNewObject.xml.temp в myNewObject.xml с использованием File.MoveTo

0

Вы можете сделать что-то вроде следующего. Напишите свой xml в StringBuilder() и напишите содержимое файла stringBuilder в файл.

public static void SerializeToXmlFile(object obj, Type type, string fileName, string xsltPath) { 
     var ns = new XmlSerializerNamespaces(); 
     ns.Add(String.Empty, String.Empty); 
     var serializer = new XmlSerializer(type); 

     var settings = new XmlWriterSettings { Indent = true, IndentChars = "\t" }; 

     StringBuilder sb = new StringBuilder(); 
     using (var w = XmlWriter.Create(sb, settings)) { 

      if (!String.IsNullOrEmpty(xsltPath)) { 
       w.WriteProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"" + xsltPath + "\""); 

      } 
      serializer.Serialize(w, obj, ns); 
     } 

     File.WriteAllText(fileName, sb.ToString()); 
    } 
2

FileStream и XMLWriter должны быть размещены в блоке с использованием

using (FileStream fs = File.Create(filename)) 
using (var w = XmlWriter.Create(fs, settings)) 
{ 
    // your code 
} 

Я считаю, что, используя приведенный ниже код не сможет выпустить поток файла. Поэтому, если вы дважды запускаете код за один сеанс, он не сработает.

using (var w = XmlWriter.Create(File.Create(filename), settings)) 
+0

вы правы. Нижняя часть фактически не освобождает поток. – Ello

Смежные вопросы