2016-05-02 18 views
0

Ich arbeite an einer Anwendung in C#. Ich habe eine Klasse DirectorVideo (Videodirektoren) und eine Interface-Klasse. In tha Interface-Klasse muss ich die Liste der Videoregisseure serialisiert, aber ich die folgende Fehlermeldung:Fehler beim Serialisieren einer Liste von Objekten in meiner Schnittstelle

Eine nicht behandelte Ausnahme des Typs ‚System.InvalidOperationException‘ aufgetreten in System.Xml.dll

Zusätzliche Informationen: Es wurde ein Fehler vom Typ 'System.Collections.Generic.List`1 [ProiectC.DirectorVideo]'.

DirectorVide Klasse:

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

namespace ProiectC 
{ [Serializable] 
    public class DirectorVideo: FunctiiFisier, IComparable<DirectorVideo>, ICloneable 
    { 
     public FisierVideo[] fisiere { get; set; } 
     public String cale { get; set; } 
     public int nrFisiere { get; set; } 

     public DirectorVideo(FisierVideo[] fisiere, String cale, int nrFisiere) { 
      this.fisiere = fisiere; 
      this.cale = cale; 
      this.nrFisiere = nrFisiere; 

     } 
     public DirectorVideo(DirectorVideo dir) { 

      this.cale = dir.cale; 
      this.nrFisiere = dir.nrFisiere; 
      this.fisiere = dir.fisiere; 

     } 

     public int CompareTo(DirectorVideo other) 
     { 
      var caleOrder = this.cale.CompareTo(other.cale); 
      return caleOrder; 
     } 

     public object Clone() 
     { 
      var newDirector=(DirectorVideo)MemberwiseClone(); 
      newDirector.cale=(String)cale.Clone(); 
      newDirector.nrFisiere = newDirector.nrFisiere; 
      newDirector.fisiere = new FisierVideo[newDirector.nrFisiere]; 
      for (int i = 0; i < newDirector.nrFisiere; i++) 
       newDirector.fisiere[i] = (FisierVideo)fisiere[i]; 
      return newDirector; 
     } 

     public DirectorVideo() { 

     } 


     public DirectorVideo(string cale) { 
      this.cale = cale; 

     } 

    public override List<string> listFiles(string path) 
    {  bool ok=false; 
      String[] extensions = {".webm", ".mkv", ".flv", ".vob", ".drc", ".gif", 
      ".gifv", ".mng", ".avi", ".mp4", ".wmf", "mpeg"}; 
      DirectoryInfo d = new DirectoryInfo(path);//Assuming Test is your Folder 
      FileInfo[] Files = d.GetFiles("*.*"); //Getting Text files 
      string str = ""; 
      List<string> files=new List<string>(); 
      foreach (FileInfo file in Files) 
      { 
       str = file.Name; 
       string ext = extension(str); 
       ok = false; 
       for (int i = 0; i < extensions.Length; i++) 
       { 
        if (ext.Equals(extensions[i])) 
         ok = true; 
       } 
       if (ok) 
        files.Add(str); 



      } 
      if (files != null) 
       return files; 
      else { 
       files.Add("Nu a fost gasit nici un fisier video"); 
       return files; 

      } 

     } 

     public override int countFiles(string path) 
     { 
      int count = 0; 
      bool ok = false; 
      String[] extensions = {".webm", ".mkv", ".flv", ".vob", ".drc", ".gif", 
      ".gifv", ".mng", ".avi", ".mp4", ".wmf", "mpeg"}; 
      DirectoryInfo d = new DirectoryInfo(path);//Assuming Test is your Folder 
      FileInfo[] Files = d.GetFiles("*.*"); //Getting Text files 
      string str = ""; 
      List<string> files = new List<string>(); 
      foreach (FileInfo file in Files) 
      { 
       str = file.Name; 
       string ext = extension(str); 
       ok = false; 
       for (int i = 0; i < extensions.Length; i++) 
       { 
        if (ext.Equals(extensions[i])) 
         ok = true; 
       } 
       if (ok) 
        count++; 
      } 
      return count; 
     } 

     public override string extension(string file) 
     { 
      return Path.GetExtension(file); 
     } 

     public override string ToString() 
     { if (this.fisiere != null) 
       return string.Format("{0}", string.Join<FisierVideo>("\n", fisiere)); 
      else 
       return ("Folderul nu contine fisiere video"); 
     } 

     public static List<DirectorVideo> operator+(List<DirectorVideo> directoare, DirectorVideo dir) 
     { 
      directoare.Add(dir); 
      return directoare; 
     } 
    } 
} 

Interfaceklasse:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Xml.Serialization; 

namespace ProiectC 
{ [Serializable] 
    public partial class Interfata : Form 
    { public DirectorVideo dir { get; set; } 
     public List<DirectorVideo> directors { get; set; } = new List<DirectorVideo>(); 

     public Interfata() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

     } 

     private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 

     private void btnCale_MouseClick(object sender, MouseEventArgs e) 
     { 

      DirectorVideo dir = new DirectorVideo(); 
      string cale = txtCale.Text; 
      int nrFisiere = dir.countFiles(cale); 
      List<string> fisiereLista = dir.listFiles(cale); 
      FisierVideo[] fisiere = new FisierVideo[fisiereLista.Count]; 
      for (int i = 0; i < nrFisiere; i++) 
       fisiere[i] = new FisierVideo(fisiereLista[i]); 

      DirectorVideo director = new DirectorVideo(fisiere, cale, nrFisiere); 
      //cloneable 
      this.dir = (DirectorVideo)director.Clone(); 
      DirectorVideo combo = null; 
      bool ok = true; 
      for (int i = 0; i < comboBox.Items.Count; i++) 
      { //comparable 
       combo = new DirectorVideo(comboBox.GetItemText(comboBox.Items[i])); 
       if (this.dir.CompareTo(combo) == 0) 
        ok = false; 

      } 
      if (ok == true) 
      { 
       comboBox.Items.Add(cale); 
       this.directors.Add(this.dir); 
      } 

      Console.WriteLine(directors.Count); 
     } 

     private void comboBox_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      listView.Clear(); 
      for (int i = 0; i < this.directors.Count; i++) 
      { 
       if (this.directors[i].cale.Equals(comboBox.Text)) 
       { 
        for (int j = 0; j < this.directors[i].nrFisiere; j++) 
         listView.Items.Add(this.directors[i].fisiere[j].numeFisier); 
       } 
      } 
     } 

     private void saveToolStripMenuItem_Click(object sender, EventArgs e) 

     { 
      XmlSerializer serializer = new XmlSerializer(typeof(List<DirectorVideo>)); 
      using (StreamWriter writer = new StreamWriter("SerializedXML.xml")) 
      { serializer.Serialize(writer, this.directors); } 
     } 
    } 
} 
+1

1) Was ist die vollständige 'ToString()' Ausgabe der Ausnahme einschließlich der Nachricht, Traceback, Typ ** und InnerException **? 2) Können Sie versuchen, Ihre Frage auf ein [minimales Beispiel] (https://stackoverflow.com/help/mcve) zu vereinfachen, das als Konsolenanwendung getestet werden könnte? Sie haben eine Menge GUI-Code dort, der fremd erscheint. – dbc

+0

Sie können sich [Problembehandlung bei häufigen Problemen mit dem XmlSerializer] (https://msdn.microsoft.com/en-us/library/aa302290.aspx) ansehen. – dbc

Antwort

1

Achten Sie darauf, dass alle Eigenschaften der Klasse versuchen Sie sind auch serializable zu serialisiert und haben öffentliche Getter/Setter . Zum Beispiel muss auch Ihr Typ FisierVideo serialisierbar sein. Wenn es Eigenschaften gibt, die Sie nicht serialisieren möchten, dekorieren Sie sie mit der XmlIgnoreAttribute.

[XmlIgnore] 
public FisierVideo[] fisiere { get; set; } 
+0

Das Problem ist auf System.Collections.Generic, aber ich kann nicht verstehen, warum – Sebi95

+0

'[Serializable]' hat keine Auswirkungen auf 'XmlSerializer'. Um einen Typ mit 'XmlSerializer' zu serialisieren, muss er öffentlich sein und einen öffentlichen parameterlosen Konstruktor haben. – dbc

Verwandte Themen