2014-04-08 5 views
2

관찰 가능한 컬렉션을 사용하여 내 앱에 목록을 저장하고 XML을 사용하여 해당 목록을 격리 된 저장소에 저장합니다. 응용 프로그램은 항목을 추가 할 때 확인되지만 항목을 삭제하고 응용 프로그램을 다시 시작하면 XML을 읽을 수 없습니다. 나는 도구를 사용하여 격리 된 저장소에서 해당 XML을 가져오고 네, 구조가 잘못되었습니다. XML 파일이 여전히 삭제 된 항목의 일부를 유지처럼 여기 observablecollection에서 항목을 삭제하면 XML serialize 업데이트가 실패합니다.

코드

public void saveToXML() 
     { 
      IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();      
      XmlWriterSettings xmlWriterSetting = new XmlWriterSettings(); 
      xmlWriterSetting.Indent = true; 
      using (storage) 
      { 
       using (IsolatedStorageFileStream fsIdea = new IsolatedStorageFileStream("Idea.xml", FileMode.OpenOrCreate, storage)) 
       { 
        using (XmlWriter xWIdea = XmlWriter.Create(fsIdea, xmlWriterSetting)) 
        { 
         XmlSerializer xSIdea = new XmlSerializer(typeof(ObservableCollection<IdeaViewModel>)); 
         xSIdea.Serialize(xWIdea, App.ViewModel.ItemsIdea); 
        } 
       }     
      } 
     } 

     public void readFromXML() 
     { 
      IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); 
      if (!storage.FileExists("Idea.xml")) 
      { 
       saveToXML(); 
      } 
      using (storage) 
      { 
       using (IsolatedStorageFileStream fsIdea = new IsolatedStorageFileStream("Idea.xml", FileMode.Open, storage)) 
       { 
        XmlSerializer xSIdea = new XmlSerializer(typeof(ObservableCollection<IdeaViewModel>)); 
        App.ViewModel.ItemsIdea = xSIdea.Deserialize(fsIdea) as ObservableCollection<IdeaViewModel>; 
       }     
      } 
     } 

이며, 여기에 내가 항목을 삭제하고 응용 프로그램을 다시 시작할 때 잘못된 XML 파일이며, 오류가, 9 호선에있다 본다 ?

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfIdeaViewModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <IdeaViewModel> 
    <IdeaContent>sdfsd</IdeaContent> 
    </IdeaViewModel> 
    <IdeaViewModel> 
    <IdeaContent>sdfds</IdeaContent> 
    </IdeaViewModel> 
</ArrayOfIdeaViewModel>aContent>sf</IdeaContent> 
    </IdeaViewModel> 
    <IdeaViewModel> 
    <IdeaContent>sdfsd</IdeaContent> 
    </IdeaViewModel> 
    <IdeaViewModel> 
    <IdeaContent>sdfds</IdeaContent> 
    </IdeaViewModel> 
</ArrayOfIdeaViewModel> 

(나는 응용 프로그램의 생성자에서 readFromXML()을 넣고, 여기에

// Code to execute when the application is deactivated (sent to background) 
    // This code will not execute when the application is closing 
    private void Application_Deactivated(object sender, DeactivatedEventArgs e) 
    { 
     saveToXML();      
    } 

    // Code to execute when the application is closing (eg, user hit Back) 
    // This code will not execute when the application is deactivated 
    private void Application_Closing(object sender, ClosingEventArgs e) 
    { 
     // Ensure that required application state is persisted here. 
     saveToXML();    
    } 

답변

0

에서하여 saveToXML는() 당신은 FileMode.Create instead of FileMode.OpenOrCreate를 사용하여 저장하는 경우 : 귀하의 경우

using (IsolatedStorageFileStream fsIdea = new IsolatedStorageFileStream("Idea.xml", FileMode.Create, storage)) 

당신 따라서 파일의 이전 버전을 편집 중이므로 일부 인공물이있을 수 있습니다.

+0

감사합니다. :) 문제는 고쳐진 것 같지만 2 개의 작은 질문이 궁금합니다 : 1. 위의 솔루션을 사용해야합니다 (종료시에만 저장해야 함). 또는 앱에서 목록을 수정할 때마다 변경 사항을 저장해야합니까? 앱에 충분한 시간이 있습니다. 마침내 저장하십시오. 2. 나는 여기에 3 ~ 4 개의 질문을했으며, 당신이 나를 즉각적으로 도왔다 고 생각합니다. 감사합니다. 그러나 | 당신은 항상 온라인에 머물러 있니? :) – user3448806

+0

@ user3448806 1은 사용자의 데이터, 사용자가 수정 한 횟수, 크기 등에 따라 다릅니다. 앱이 비활성화/종료되는 데 제한된 시간이 있습니다. 너무 많은 데이터와 수정이 아니라면 변경 직후에 저장합니다. 모든 것은 앱의 목적에 달려 있습니다. 2 ~는 운 좋게 항상 없습니다.) – Romasz

관련 문제