2009-09-23 10 views
6

ich zwei Klassen wie folgt:XML-Serialisierung von einer Sammlung in C#

public class Info 
    { 
     [XmlAttribute] public string language; 
     public int version; 
     public Book book; 

     public Info() { } 

     public Info(string l, int v, string author, int quantity, int price) 
     { 
     this.language = l; 
     this.version = v; 
     book = new Book(author, quantity, price); 
     } 


    } 

    public class Book 
    { 
      [XmlAttribute] public string author; 
      public int quantity; 
      public int price; 
      [XmlIgnore]public int total; 
      public NameValueCollection nvcollection = new NameValueCollection(); 

      public Book() { } 

      public Book(string author, int quantity, int price) 
      { 
      this.author = author; 
      this.quantity = quantity; 
      this.price = price; 
      total = quantity * price; 
      nvcollection.Add(author, price.ToString()); 
      } 

    } 

Ich habe eine Arraylist erstellt, die die beiden Instanzen von Info-Klasse fügt sich wie folgt:

  FileStream fs = new FileStream("SerializedInfo.XML", FileMode.Create); 

      List<Info> arrList = new List<Info>(); 

      XmlSerializer xs = new XmlSerializer(typeof(List<Info>)); 

      Info pObj = new Info("ABC", 3, "DEF", 2, 6); 

      Info pObj1 = new Info("GHI", 4, "JKL", 2, 8); 

      arrList.Add(pObj); 
      arrList.Add(pObj1); 

      xs.Serialize(fs, arrList); 

      fs.Close(); 

Aber als ich Versuchen Sie zu serialisieren, ich bekomme eine Ausnahme als "Es gab einen Fehler, der den Typ 'System.Collections.Generic.List`1 [ConsoleApplicationSerialization.Info]' widerspiegelt."

Kann mir jemand dabei helfen?

Auch, anstelle von Namevaluecollection, welche Art von Struktur kann ich verwenden?

Antwort

3

Namevaluecollection nicht direkt die ICollection-Schnittstelle implementieren. Stattdessen NameValueCollection erweitert NameObjectCollectionBase.Diese implementiert den ICollection Schnittstelle, und das überladene Add (System.String) Methode wird in der Namevaluecollection Klasse nicht implementiert. Wenn Sie verwenden, um den XMLSerializer, die XmlSerializer zu serialisiert versucht oder deserialisieren den Namevaluecollection als ein generisches ICollection. Daher sucht nach dem Standard Hinzufügen (System.String). In Abwesenheit von die Add (System.String) Methode wird die Ausnahme ausgelöst.

Versuchen Sie, eine Container-Klasse mit benutzerdefinierten Serialisierung verwenden:

http://nayyeri.net/serialize-namevaluecollection

aber ich bin nicht sicher, was Sie eigentlich erreichen wollen. Was wird die nvcollection außer dem Autor des Buches und dem Preis einmal enthalten?

Haben Sie vor, es auf Buchebene oder höher in der Objekthierarchie zu verwenden?

Statt eine Namevaluecollection verwenden, könnten Sie auf ein Dictionary wollen, da es mehr Flexibilität in Bezug auf was hat es zu enthalten: http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!699.entry

0

Ich lief den Code, und die innerste Ausnahme Sie diese erhalten, ist:

Um XML serialisiert, Typen zu sein, die vererben ICollection muss eine Implementierung von Add (System.String) haben überhaupt Ebenen ihrer Vererbung Hierarchie. System.Collections.Specialized.NameValueCollection implementiert nicht Add (System.String).

Also der XML-Serializer benötigt eine einfachere Art der Sammlung. Ich denke, Ihre beste Option besteht darin, Ihre NameValueCollection in eine Liste einer benutzerdefinierten Klasse zu konvertieren, die den Namen und den Wert vor der Serialisierung enthält.

+0

gut, wenn ich nur die Namevaluecollection von Klasse Buch entfernen dann alles funktioniert. – Archie

0

Aktualisiert: Sieht aus wie die NamedValueCollection ist Ihr echtes Problem, da es nicht serialisierbar ist. Vielleicht könnten Sie eine Serializable dictionary verwenden.

+0

Im Gegensatz zu Klassen, die mit der Standardserialisierung verarbeitet werden, müssen Klassen das Serializable-Attribut nicht aufweisen, das mit der XML-Serialisierung verarbeitet werden soll. – Archie

+0

mein Fehler. Es sieht so aus, als müssten Sie einen benutzerdefinierten Serialisierungscode verwenden. –

1

Schauen Sie sich innere Ausnahmen an.

Als Erstes müssen Sie die Buchklasse serialisierbar machen. Die zweite Sache ist, dass Namevaluecollection kann nicht mit XmlSerializer serialisiert werden, weil:

„XML serialisierbar sein, Typen, die vererben ICollection muss eine Implementierung von Add (System.String) haben auf allen Ebenen ihre Vererbung Hierarchie. System.Collections.Specialized.NameValueCollection implementiert nicht Add (System.String). "

Es ist eine Nachricht von innerer Ausnahme.

funktioniert gut mit diesem Stück Code:

[Serializable] 
     public class Book 
     { 
      [XmlAttribute] 
      public string author; 
      public int quantity; 
      public int price; 
      [XmlIgnore] 
      public int total; 
      //public NameValueCollection nvcollection = new NameValueCollection(); 
      public Book() { } 
      public Book(string author, int quantity, int price) 
      { 
       this.author = author; 
       this.quantity = quantity; 
       this.price = price; 
       total = quantity * price; 
       //nvcollection.Add(author, price.ToString()); 
      } 
     } 
+0

Das Attribut "[Serializable]" spielt für die XML-Serialisierung keine Rolle. –