2012-06-04 45 views
3

除了我序列化到使用C#的XmlSerializer的XML文件對象的列表,我想存儲在相同的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

這是可以做到的,但我非常強烈建議不要使用流做到這一點。一個作家通過重新開放流(完成後,序列化器將關閉它),你就在同時開始,這就是爲什麼你越來越異常的XML。

你可以做什麼,是流重新加載到如下。這是一個編輯好的功能,可能對您更好。

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賺取你保持的責任跟蹤誰解析什麼,這可能很快成爲巨大的痛苦 –