2012-06-04 3 views
3

В дополнение к списку объектов, которые я сериализую в XML-файл с помощью XmlSerializer C#, я хотел бы сохранить несколько независимых элементов (в основном строки из текстовых полей) в одном и том же XML.Объединение XmlSerializer и XmlWriter?

public static void SaveBehaviors(ObservableCollection<Param> listParams) 
    { 
     XmlSerializer _paramsSerializer = new XmlSerializer(listParams.GetType()); 
     string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
     path += "\\test.xml"; 
     using (TextWriter writeFileStream = new StreamWriter(path)) 
     { 
      _paramsSerializer.Serialize(writeFileStream, listParams); 

      using (XmlWriter writer = XmlWriter.Create(writeFileStream)) 
      { 
       writer.WriteStartElement("Foo"); //test entry... 
       writer.WriteAttributeString("Bar", "Some & value"); 
       writer.WriteElementString("Nested", "data"); 
       writer.WriteEndElement(); 
      } 
     } 
    } 

Однако десериализация «test.xml» приводит к ошибке из-за добавленного элемента. Я предполагаю, что запись в сериализованном XML-файле запрещена и ее следует избегать?

ответ

2

Нет. Не делайте этого.

Если вам нужно сериализовать больше, чем ваше ObservableCollection, тогда определите содержащийся тип и сериализуйте его.

public static void SaveBehaviors(ObservableCollection<Param> listParams) 
{ 
    XmlSerializer _paramsSerializer = new XmlSerializer(typeof(ContainingType)); 
    var c = new ContainingType(listParams); 
    c.ExtraInformation = whatever....; 

    string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
    path += "\\test.xml"; 
    using (TextWriter writeFileStream = new StreamWriter(path)) 
    { 
     _paramsSerializer.Serialize(writeFileStream, c); 
    } 
} 

Используйте XmlSerializer.

0

Это можно сделать, но я очень рекомендую не использовать поток для этого. Повторно открыв поток в писателе (сериализатор закроет его по окончании), вы начнете в начале этого периода, поэтому вы получаете MalFormed xml.

Что вы можете сделать, перегружает поток в XmlDocument. Вот отредактированная функция, которая может работать лучше для вас.

public static void SaveBehaviors(ObservableCollection<Param> listParams) 
{ 
    XmlSerializer _paramsSerializer = new XmlSerializer(listParams.GetType()); 
    string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
    path += "\\test.xml"; 
    using (TextWriter writeFileStream = new StreamWriter(path)) 
    { 
     _paramsSerializer.Serialize(writeFileStream, listParams); 

     using (XmlDocument doc = new XmlDocument()) 
     { 
      doc.Load(path);//load from the saved document 
      XmlNode fooNode = doc.CreateElement("foo");//create node 
      XmlAttribute fooAtt = doc.CreateAttribute("bar");//create attribute 
      fooAtt.InnerText = "some att data";//set data 
      fooNode.InnerText = "some node text";//set data 
      fooNode.Attributes.Append(fooAtt);//add attribute to node 
      doc.DocumentElement.AppendChild(fooNode);//add node to document 
      doc.Save(path);//save the changes made 
     } 
    } 
} 

Вы могли бы использовать XmlWriter для этого, но опасность убедившись, что WriteStream помещает данные в правильном месте. Я лично не знаю достаточно о XmlWriter, чтобы сделать это, на данный момент. Это потребует довольно много экспериментов и рассмотрения моих выходных файлов. Его гораздо проще использовать встроенное форматирование, которое предоставляет XmlDocument.

0

Не запрещено, вы просто пишете нелегальный XML-файл с несколькими корневыми тегами - вам нужно выписать начальный тег элемента перед тем, как писать сериализованный объект, а затем закрыть этот тег после того, как вы выписали свой собственный элементы - в используемом коде кода вам нужно будет написать этот тег и закрыть тег вручную

+0

Я, конечно, второй, другие комментарии, что это менее целесообразно - смешивание сериализованных объектов и пользовательских xml заставляет вас нести ответственность за сохранение отслеживать, кто разбирает то, что может быстро стать гигантской болью –

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