2016-06-17 3 views
0

5 개의 목록이 있으며이를 XML로 저장하려고합니다. 내 코드는 4 개로 작동하지만 전혀 몰랐지만 5 번째 코드는 저장하지 않으려 고합니다. 모든 목록에 대해 오버로드 된 SaveXML 메서드를 사용합니다. 저장실에만 문제가 있습니다. 나는 항상 예외를 가지고 : 프로세스가 파일 Rooms.xml에 액세스 할 수 없습니다 ...XML : 프로세스가 파일에 액세스 할 수 없습니다.

public class Database 
{ 
     List<Student> dtbStudents = new List<Student>();    
     List<Teacher> dtbTeachers = new List<Teacher>(); 
     List<StudyProgramme> dtbPrograms = new List<StudyProgramme>(); 
     List<Subject> dtbSubjects = new List<Subject>(); 
     List<Room> dtbRooms = new List<Room>();    

     public Database() 
     { 
      LoadXML(); 
     } 

     public void SaveXML() 
     { 
      SaveXML(dtbStudents); 
      SaveXML(dtbTeachers); 
      SaveXML(dtbPrograms); 
      SaveXML(dtbSubjects); 
      SaveXML(dtbRooms); 
     } 
     public void SaveXML(List<Teacher> list) 
     { 
      XmlSerializer serializer = new XmlSerializer(list.GetType()); 
      using (TextWriter writer = new StreamWriter(@"Teachers.xml")) 
      { 
        serializer.Serialize(writer, list); 
      } 
     } 
     public void SaveXML(List<StudyProgramme> list) 
     { 
      XmlSerializer serializer = new XmlSerializer(list.GetType()); 
      using (TextWriter writer = new StreamWriter(@"StudyProgrammes.xml")) 
      { 
      serializer.Serialize(writer, list); 
      } 
     } 
     public void SaveXML(List<Student> list) 
     { 
      XmlSerializer serializer = new XmlSerializer(list.GetType()); 
      using (TextWriter writer = new StreamWriter(@"Students.xml")) 
      { 
       serializer.Serialize(writer, list); 
      } 
     } 
     public void SaveXML(List<Subject> list) 
     { 
      XmlSerializer serializer = new XmlSerializer(list.GetType()); 
      using (TextWriter writer = new StreamWriter(@"Subjects.xml")) 
      { 
       serializer.Serialize(writer, list); 
      } 
     } 
     public void SaveXML(List<Room> list) 
     { 
      XmlSerializer serializer = new XmlSerializer(list.GetType()); 
      using (TextWriter writer = new StreamWriter(@"Rooms.xml")) 
      { 
      serializer.Serialize(writer, list); 
      }  
     } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Database dtb = new Database(); 

     dtb.SaveXML();    
     Console.ReadKey(); 
    } 
} 

는로드 XMLS 데이터 또는 무엇에 문제가 될 수 있습니까? 그 기능을 게시 할 수 있습니다. 도움 주셔서 감사합니다! 여기

내 부하 기능 : 당신의 LoadXML()에서

public void LoadXML() 
    { 
     XmlReader Reader = XmlReader.Create(@"Students.xml"); 
     XmlSerializer deserializer = new XmlSerializer(typeof(List<Student>)); 
     dtbStudents = (List<Student>)deserializer.Deserialize(Reader); 

     Reader = XmlReader.Create(@"Teachers.xml"); 
     deserializer = new XmlSerializer(typeof(List<Teacher>)); 
     dtbTeachers = (List<Teacher>)deserializer.Deserialize(Reader); 

     Reader = XmlReader.Create(@"StudyProgrammes.xml"); 
     deserializer = new XmlSerializer(typeof(List<StudyProgramme>)); 
     dtbPrograms = (List<StudyProgramme>)deserializer.Deserialize(Reader); 

     Reader = XmlReader.Create(@"Rooms.xml"); 
     deserializer = new XmlSerializer(typeof(List<Room>)); 
     dtbRooms = (List<Room>)deserializer.Deserialize(Reader); 

     Reader = XmlReader.Create(@"Subjects.xml"); 
     deserializer = new XmlSerializer(typeof(List<Subject>)); 
     dtbSubjects = (List<Subject>)deserializer.Deserialize(Reader); 

     Reader.Close(); 
    } 
+0

는 난 단지 목록을 3'SaveXML'를 참조하십시오. –

+0

거기에 3 개의 점이 있습니다. 나는 그들을 게시 할 수 있지만 다른 매개 변수가있는 경우에만 동일합니다. – Deyeth

+0

[mcve]가 좋을 것입니다. –

답변

0

, 당신은 단지 마지막 리더 예를 닫습니다 처음 네 XmlReader 인스턴스가 버려진 따라서

XmlReader Reader = XmlReader.Create(@"Students.xml"); 
    // Snip code for reading 
    Reader = XmlReader.Create(@"Teachers.xml"); 
    // Snip code for reading 
    Reader = XmlReader.Create(@"StudyProgrammes.xml"); 
    // Snip code for reading 
    Reader = XmlReader.Create(@"Rooms.xml"); 
    // Snip code for reading 

    Reader = XmlReader.Create(@"Subjects.xml"); 
    // Snip code for reading 
    // Here the last instance is closed -- but the other four were 
    // never closed. 
    Reader.Close(); 

을 때의 값 참조 변수 Reader이 변경되어 가비지를 수집하고 종료 할 때 이 닫힙니다. . 파이널 라이저 스레드가 아직 파일을 닫지 않았기 때문에 다시 쓰려고 할 때 파일 중 하나가 나중에 열리면보고있는 예외가 발생합니다. 당신이 그것으로 완료로

대신, 당신은 즉시 각 인스턴스 폐기해야합니다

using (var reader = XmlReader.Create(@"Students.xml")) 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(List<Student>)); 
     dtbStudents = (List<Student>)deserializer.Deserialize(reader); 
    } 

    // Similarly for the others. 
+0

고마워! 너는 신이다 :-) – Deyeth

관련 문제