2012-06-12 69 views
0

我想將一些文本的內容序列化爲一個XML文件(當用戶保存它們的選擇時執行),然後將其反序列化(當用戶選擇顯示其保存的選擇時)。無法序列化爲XML

關於序列化,我一直在關注以下tutorial。我也嘗試通過LINQ到XML來做到這一點,但要麼獲取名稱空間錯誤,要麼該工具沒有返回錯誤,但沒有工作(與下面描述的相同的問題)。

我遇到的問題是我的代碼沒有返回任何錯誤,但函數不工作(我有一個標籤控件,可以讓我看到'catch'被返回)。我正在使用C#在Expression Blend中構建工具。

這裏是我的SaveSelection.cs類

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 
using System.Xml.Serialization; 
using System.Xml; 

namespace DYH 
{ 
public class SaveSelections 
{ 
    [XmlAttribute("Title")] 
    public string Title 
    { get; set; } 

    [XmlElement("Roof")] 
    public string RoofSelection 
    { get; set; } 

    [XmlElement("Cladding")] 
    public string CladdingSelection 
    { get; set; } 

    [XmlElement("MixedCladding")] 
    public string MixedCladdingSelection 
    { get; set; } 

    [XmlElement("FAJ")] 
    public string FAJSelection 
    { get; set; } 

    [XmlElement("GarageDoor")] 
    public string GarageDoorSelection 
    { get; set; } 

    [XmlElement("FrontDoor")] 
    public string FrontDoorSelection 
    { get; set; } 
} 
} 

這裏是我的C#代碼

// Save Selection Button 
     private void Button_SaveSelection_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      try 
      { 
       // Save selections into the SavedSelections.xml doc 
       SaveSelections userselection = new SaveSelections(); 
       userselection.Title = TextBox_SaveSelection.Text; 
       userselection.RoofSelection = Button_Roof_Select.Text; 
       userselection.CladdingSelection = Button_Cladding_Select.Text; 
       userselection.MixedCladdingSelection = Button_MixedCladding_Select.Text; 
       userselection.FAJSelection = Button_FAJ_Select.Text; 
       userselection.GarageDoorSelection = Button_GarageDoor_Select.Text; 
       userselection.FrontDoorSelection = Button_FrontDoor_Select.Text; 

       SerializeToXML(userselection); 

//    XDocument xmlSaveSelections = XDocument.Load("../SavedSelections.xml"); 
//   
//    XElement newSelection = new XElement("Selection", //xmlSaveSelections.Element("Selections").Add(
//      //new XElement("Selection", 
//      new XElement("Title", TextBox_SaveSelection.Text), 
//      new XElement("RoofSelection", Button_Roof_Select.Text), 
//      new XElement("CladdingSelection", Button_Cladding_Select.Text), 
//      new XElement("MixedCladdingSelection", Button_MixedCladding_Select.Text), 
//      new XElement("FAJSelection", Button_FAJ_Select.Text), 
//      new XElement("GarageDoorSelection", Button_GarageDoor_Select.Text), 
//      new XElement("FrontDoorSelection", Button_FrontDoor_Select.Text)); 
//    
////    xmlSaveSelections.Add(newSelection); 
////    xmlSaveSelections.Save("../SavedSelections.xml"); 

       SelectionLabel.Text = "Your selection has been saved as " + "'" + TextBox_SaveSelection.Text + "'. We suggest you write down the name of your selection."; 
      } 
      catch(Exception ex) 
      { 
          throw ex; 
       SelectionLabel.Text = "There was a problem saving your selection. Please try again shortly."; 
      } 
     } 

     // Saves SaveSelection.cs to XML file SavedSelections.xml 
     static public void SerializeToXML(SaveSelections selection) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(SaveSelections)); 
      TextWriter textWriter = new StreamWriter(@"/SavedSelections.xml"); 
      serializer.Serialize(textWriter, selection); 
      textWriter.Close(); 
     } 

我已經離開了我以前的嘗試之一的證據註釋掉,所以你可以看到以前的格式我試過。

我的問題是,當我嘗試使用該工具時,SelectionLabel.Text返回「保存您的選擇時出現問題,請稍後再試。」所以我知道代碼正在返回catch而不執行'try'。

任何幫助?

編輯18/6/2012:下面的代碼是根據問題的正確答案工作的代碼。

public void Button_SaveSelection_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     string roofSelection = TextBox_SaveSelection.Text + "_RoofSelection"; 
     string claddingSelection = TextBox_SaveSelection.Text + "_CladdingSelection"; 
     string mixedCladdingSelection = TextBox_SaveSelection.Text + "_MixedCladdingSelection"; 
     string fajSelection = TextBox_SaveSelection.Text + "_FAJSelection"; 
     string garageDoorSelection = TextBox_SaveSelection.Text + "_GarageDoorSelection"; 
     string frontDoorSelection = TextBox_SaveSelection.Text + "_FrontDoorSelection"; 

     try 
     { 
      using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       // Gives us 6Mb of storage space in IsoStore 
       Int64 isoSpaceNeeded = 1048576 * 6; 
       Int64 currentIsoSpace = store.AvailableFreeSpace; 

       // If space needed is greater than (>) space available, increase space 
       if (isoSpaceNeeded > currentIsoSpace) 
       { 
        // If user accepts space increase 
        if (store.IncreaseQuotaTo(currentIsoSpace + isoSpaceNeeded)) 
        { 
         IsolatedStorageFileStream file = store.CreateFile("SavedSelections.txt"); 
         file.Close(); 

         // Stream writer to populate information in 
         using (StreamWriter sw = new StreamWriter(store.OpenFile("SavedSelections.txt", FileMode.Open, FileAccess.Write))) 
         { 
          appSettings.Add(roofSelection, Button_Roof_Select.Text); 
          sw.WriteLine(roofSelection); 
          appSettings.Add(claddingSelection, Button_Cladding_Select.Text); 
          sw.WriteLine(claddingSelection); 
          appSettings.Add(mixedCladdingSelection, Button_MixedCladding_Select.Text); 
          sw.WriteLine(mixedCladdingSelection); 
          appSettings.Add(fajSelection, Button_FAJ_Select.Text); 
          sw.WriteLine(fajSelection); 
          appSettings.Add(garageDoorSelection, Button_GarageDoor_Select.Text); 
          sw.WriteLine(garageDoorSelection); 
          appSettings.Add(frontDoorSelection, Button_FrontDoor_Select.Text); 
          sw.WriteLine(frontDoorSelection); 
         } 

         SelectionLabel.Text = "Your selection has been saved as " + "'" + TextBox_SaveSelection.Text + "'. We suggest you write down the name of your selection."; 
        } 
       } 
      } 

      SelectionLabel.Text = "Your selection has been saved as " + "'" + TextBox_SaveSelection.Text + "'. We suggest you write down the name of your selection."; 
     } 
     catch //(Exception ex) 
     { 
      //throw ex; 
      SelectionLabel.Text = "There was a problem saving your selection. Please try again shortly."; 
     } 
    } 
+0

應該捕獲異常,並看到該消息是縮小問題 – AvengingBudda

回答

0

看起來像你的問題是因爲你想要一個文件,但該文件不是來自用戶操作啓動的FileSaveDialog。您遇到了Silverlight的安全功能,您不允許訪問本地文件系統。相反,請嘗試寫入IsolatedStorage。但是,請注意,最終用戶可以完全(也可以選擇性地)禁用應用程序存儲,因此您還需要處理這些異常。

Here's a quick article on how to use IsolatedStorage.

+0

謝謝,我會考慮這個東西和follwing [鏈接](HTTP給這個一去 – Noonles01

+0

我這樣做:// www.wonderhowto.com/how-to-use-isolated-storage-silverlight-358906/),再次沒有運行時錯誤,但這次,我的TextBlock通知根本不起作用。您希望我在您的建議後更新代碼嗎? – Noonles01

+0

什麼是例外? –