2012-06-12 5 views
0

일부 텍스트의 내용을 XML 파일로 serialize (사용자가 선택 항목을 저장할 때 수행됨) 한 다음 나중에 사용자가 선택한 선택 사항을 표시하도록 선택하면 해당 내용이 deserialize됩니다.XML로 직렬화 할 수 없습니다.

다음은 tutorial의 직렬화입니다.

LINQ to XML을 통해이 작업을 시도했지만 네임 스페이스 오류가 발생했거나 도구가 오류를 반환하지는 않았지만 작동하지 않았습니다 (아래에서 설명하는 것과 동일한 문제가 있음).

문제는 내 코드가 오류를 반환하지 않지만 함수가 작동하지 않는다는 것입니다. 즉, 'catch'가 반환된다는 것을 알 수있는 레이블 컨트롤이 있습니다. Expression Blend에서 C#을 사용하여 도구를 작성합니다. 여기

여기
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; } 
} 
} 

내가 그래서 당신이 이전 형식을 볼 수 있습니다 주석 내 이전의 시도 중 하나의 증거를 떠난

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

내 C# 코드 내 SaveSelection.cs 클래스 I 시도했다.

제 문제는이 도구를 사용하려고 할 때 SelectionLabel.Text가 "선택 항목을 저장하는 중에 문제가 발생했습니다. 잠시 후 다시 시도하십시오." 그래서 나는 코드가 catch를 반환하고 'try'를 실행하지 않는다는 것을 안다.

어떤 도움 ??

편집 18/6/2012 : 아래 코드는 질문에 대한 정답에 따라 작동하는 코드입니다. 파일로 노력하고 있지만, 해당 파일은 사용자의 작용에 의해 시작된 FileSaveDialog에서 오지 않았기 때문에

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

당신은 예외를 catch하고 메시지 문제를 내가 이것으로 볼 것이다 – AvengingBudda

답변

0

그것은 당신의 문제처럼 보인다는 것입니다. 로컬 파일 시스템에 대한 액세스가 허용되지 않는 Silverlight의 보안 기능을 사용하고 있습니다. 대신 IsolatedStorage에 기록하십시오. 그러나 최종 사용자는 응용 프로그램 저장소를 완전히 (선택적으로) 비활성화 할 수 있으므로 이러한 예외도 처리해야합니다.

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

+0

감사를 좁힐 무엇인지 확인하고 [링크] (HTTP를 follwing을하여이는 내가 이런 짓을 – Noonles01

+0

갈 제공해야합니다 : // www.wonderhowto.com/how-to-use-isolated-storage-silverlight-358906/), 런타임 오류는 없지만 이번에는 TextBlock 알림이 전혀 작동하지 않습니다. 제안 후에 코드를 업데이트 하시겠습니까? – Noonles01

+0

예외는 무엇입니까? –

관련 문제