2013-09-27 2 views
-1

У меня есть следующий код. В котором у меня что-то сохранено в списке, и я хочу, чтобы эти два списка были сохранены в XML-файле, но при попытке отладки программа прерывается в строке «51».Как сохранить Список в файл XML

С следующую вещь:

XmlSerializer xs = new XmlSerializer(typeof(T)); 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml; 
using System.IO; 
using System.Xml.Serialization; 

namespace Maman15cs 
{ 

    public class XSerial 
    { 
     /// <summary> 
     /// Save an instance of a class to an XML file 
     /// </summary> 
     /// <param name="filename">Full or relative path to the file</param> 
     /// <param name="cls">Class to serialize and save.</param> 
     /// <param name="t">Type of the class (use: typeof(ClassName)</param> 
     /// <returns>True on success, False on failure</returns> 
     public static void Save<T>(string filename, T cls) 
     { 
      using (Stream s = File.Open(filename, FileMode.Create)) 
      { 
       using (StreamWriter sw = new StreamWriter(s)) 
       { 
        sw.Write(SerializeObject<T>(cls)); 
        sw.Close(); 
        s.Close(); 
        return; 
       } 
      } 
     } 


     /// <summary> 
     /// Serialize the object into an XML format 
     /// </summary> 
     /// <typeparam name="T">Type of object to serialize</typeparam> 
     /// <param name="pObject">the object to serialize</param> 
     /// <returns>a string representing the XML version of the object</returns> 
     public static String SerializeObject<T>(T pObject) 
     { 
      MemoryStream memoryStream = new MemoryStream(); 
      UTF8Encoding encoding = new UTF8Encoding(); 

      XmlSerializer xs = new XmlSerializer(typeof(T)); 
      System.Xml.XmlTextWriter xmlTextWriter = new System.Xml.XmlTextWriter(memoryStream, Encoding.UTF8); 
      xs.Serialize(xmlTextWriter, (object) pObject); 
      memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
      return encoding.GetString(memoryStream.ToArray()); 
     } 

     /// <summary> 
     /// Deserialize the object back into the object from an XML string 
     /// </summary> 
     /// <typeparam name="T">Type of the object to restore</typeparam> 
     /// <param name="pXmlizedString">The string that represents the object in XML</param> 
     /// <returns>A new instance of the restored object</returns> 
     public static T DeserializeObject<T>(String pXmlizedString) 
     { 
      UTF8Encoding encoding = new UTF8Encoding(); 
      XmlSerializer xs = new XmlSerializer(typeof(T)); 
      MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(pXmlizedString)); 
      System.Xml.XmlTextWriter xmlTextWriter = new System.Xml.XmlTextWriter(memoryStream, Encoding.UTF8); 
      return (T)xs.Deserialize(memoryStream); 
     } 
    } 

    public class ClassRoom 
    { 
     public string ClassNumber{ get; set; } 
     public int NumberofPlaces { get; set; } 
     public string[,] DayandHour = new string[6, 8]; 

     public static ClassRoom AddClassRoom() 
     { 
      var classRoom = new ClassRoom(); 
      Console.WriteLine("Enter the Class number, the Number of places\n"); 
      classRoom.ClassNumber = Console.ReadLine(); 
      classRoom.NumberofPlaces = int.Parse(Console.ReadLine()); 

      return classRoom; 
     } 

     public ClassRoom AddCourseInClassroom(ClassRoom classroom, string courseNum) 
     { 
      for (int i = 0; i < 6; i++) 
      { 
       for (int j = 0; j < 8; j++) 
       { 
        if (String.IsNullOrEmpty(classroom.DayandHour[i, j])) 
        { 
         classroom.DayandHour[i, j] = courseNum; 
         return classroom; 
        } 
       } 
      } 
      return null; 
     } 

     public void PrintClassRoom(ClassRoom classroom) 
     { 
      for (int i = 0; i < 6; i++) 
      { 
       for (int j = 0; j < 8; j++) 
       { 
        if (!(String.IsNullOrEmpty(classroom.DayandHour[i, j]))) 
        { 
         Console.WriteLine(" {0}", classroom.DayandHour[i, j]); 

        } 
       } 
       Console.WriteLine("\n"); 
      } 
     } 

     public void PrintList<T>(IEnumerable<T> col) 
     { 
      foreach (var item in col) 
       Console.WriteLine(item); 
     } 

     public void DeleteCourse(string coursenum, ClassRoom classroom) 
     { 
      for (int i = 0; i < 6; i++) 
      { 
       for (int j = 0; j < 8; j++) 
       { 
        if (classroom.DayandHour[i, j] == coursenum) 
        { 

         classroom.DayandHour[i, j] = null; 
        } 
       } 
      } 
     } 
    } 


    public class Course 
    { 
     public string CourseName; 
     public string CourseNumber; 
     public int StudentsNumber; 
     public string TeacherName; 
     public string ClassNumber; 

     public static Course AddCourse() 
     { 
      Course newCourse = new Course(); 
      Console.WriteLine("Enter the Course's name, course's number, students number, teacher's name, and class' number\n"); 
      newCourse.CourseName = Console.ReadLine().ToString(); 
      newCourse.CourseNumber = Console.ReadLine(); 
      newCourse.StudentsNumber = int.Parse(Console.ReadLine()); 
      newCourse.TeacherName = Console.ReadLine().ToString(); 
      newCourse.ClassNumber = Console.ReadLine().ToString(); 
      return newCourse; 
     } 

     public void PrintCourse(Course course) 
     { 
      Console.WriteLine("The course name is " + course.CourseName); 
      Console.WriteLine("\nThe course number is " + course.CourseNumber); 
      Console.WriteLine("\nThe class number is " + course.ClassNumber); 
      Console.WriteLine("\nThe students number is " + course.StudentsNumber); 
      Console.WriteLine("\nTeacher's name is " + course.TeacherName + "\n"); 
     } 
    } 

    public class Program 
    { 
     static void Main(string[] args) 
     { 
      var course = new List<Course>(); 
      var classroom = new List<ClassRoom>(); 

      bool loop = true; 

      int actionChoice; 

      while (loop == true) { 
       Console.WriteLine("What do you want to do? (Enter number): \n 1)Add a new Course \n 2)Add a new class room \n 3)Add an existing course to an existing classroom \n 4)Read the information of a specific classroom \n 5)Read the information of all the classrooms \n 6)Read the information of a specific course \n 7)Delete a specific course in a specific classrom \n 8)Exit the program \n"); 
       actionChoice = int.Parse(Console.ReadLine()); 

       switch (actionChoice) 
       { 
        case 1: //Add a new Course 

         var new_course = Course.AddCourse(); 
         course.Add(new_course); 
         break; 

        case 2: 

         var new_classRoom = ClassRoom.AddClassRoom(); 
         classroom.Add(new_classRoom); 
         break; 

        case 3: 
         Console.WriteLine("Enter the course's number and the classroom's number"); 
         var courseNumber = Console.ReadLine(); 
         var classroomNumber = Console.ReadLine(); 

         foreach (ClassRoom room in classroom) 
         { 
          if (room.ClassNumber == classroomNumber) 

           room.AddCourseInClassroom(room, courseNumber); 
         } 

         foreach(Course _course in course) 
         { 
          if(_course.CourseNumber == courseNumber) 
           _course.ClassNumber = classroomNumber; 
         } 
         break; 

        case 4: 
         Console.WriteLine("Enter the classroom number"); 
         classroomNumber = Console.ReadLine(); 

         foreach (ClassRoom room in classroom) 
         { 
          if (room.ClassNumber == classroomNumber) 
          { 
           room.PrintClassRoom(room); 
          } 
         } 
         break; 

        case 5: 
         foreach (ClassRoom room in classroom) 
         { 
          room.PrintClassRoom(room); 
         } 
         break; 

        case 6: 
         Console.WriteLine("Enter the course number"); 
         courseNumber = Console.ReadLine(); 

         foreach (Course ccourse in course) 
         { 
          if (ccourse.CourseName == courseNumber) 
           ccourse.PrintCourse(ccourse); 
         } 
         break; 

        case 7: 
         Console.WriteLine("Enter the course's number and the classroom's num"); 
         courseNumber = Console.ReadLine(); 
         classroomNumber = Console.ReadLine(); 

         foreach (ClassRoom classRoom in classroom) 
         { 
          if (classRoom.ClassNumber == classroomNumber) 
           classRoom.DeleteCourse(courseNumber, classRoom); 
         } 
         break; 

        case 8: 
         loop = false; 
         break; 
       } 
      } 

      XSerial.Save("Course.xml", course); 
      XSerial.Save("Classroom.xml", classroom); 
     } 
    } 
} 

Если кто-то может пожалуйста помочь мне закончить это и исправить часть (я подозреваю, что проблема исходит от метода SerializeObject).

+0

Необработанное исключение типа «System.InvalidOperationException» произошло в system.Xml.dll Дополнительная информация: Был ошибка отражательного типа «System.Collections.Generic.List'1 [Maman15cs.ClassRoom]». – Boris

ответ

-1

Взгляните на API Reflection, который используется для динамического определения типов во время выполнения.

typeof против GetType(): Type Checking: typeof, GetType, or is?

Reflection API: http://msdn.microsoft.com/en-us/library/ms173183%28v=vs.90%29.aspx

+0

Спасибо, я проверю его – Boris

+1

'T.GetType()' не подлежит компиляции. –

+0

T - тип параметра, который недопустим в данном контексте. – Boris

1

Вы должны изменить эту строку

public string[,] DayandHour = new string[6, 8]; 

класса ClassRoom, поскольку многомерные массивы не поддерживаются для Xml сериализации.

Смежные вопросы