2012-08-08 11 views
7

Ich möchte eine Klasse in XML serialisieren und ihr ein XML-Attribut zuweisen. Snippet:Attribut nicht von XmlSerializer serialisiert

[XmlType(TypeName = "classmy")] 
    public class MyClass2 : List<object> 
    { 
     [XmlAttribute(AttributeName = "myattr")] 
     public string Name { get; set; } 
    } 

    public class MyConst 
    { 
     public MyConst() 
     { 
      MyClass2 myClass2 = new MyClass2 { 10, "abc" }; 

      myClass2.Name = "nomm"; 

      XmlSerializer serializer = new XmlSerializer(typeof(MyClass2)); 
      serializer.Serialize(Console.Out, myClass2); 
     } 
    } 

Aber die resultierende XML sieht wie folgt aus

<?xml version="1.0" encoding="IBM437"?> 
<classmy xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <anyType xsi:type="xsd:int">10</anyType> 
    <anyType xsi:type="xsd:string">abc</anyType> 
</classmy> 

Alles schön und gut, mit der einzigen Ausnahme, dass myClass2.Name zu sein, ist nicht serialisiert. Ich war etwas in der Linie der

<classmy myattr="nomm" [...]>[...]</classmy> 

erwarten ... Warum ist das nicht serialisiert, und wie kann es sein?

+0

Haben Sie mit [Serializable] -Attribut über Ihrer Klasse dekoriert? – Rajesh

+0

@Rajesh es wäre überhaupt nicht serialisiert * wenn nicht ... – James

+0

@James Ich hatte das gleiche Problem, das er hat und als ich mit serializable dekoriert hat es das Problem gelöst. Besonders, wenn Sie versuchen, XMLs zu schreiben. – Rajesh

Antwort

4

nicht List<T> ableiten, schaffen Klasse mit List

[XmlType(TypeName = "classmy")] 
public class MyClass2 
{ 
    [XmlAttribute(AttributeName = "Items")] 
    List<object> Items { get; set; } //need to change type in `<>` 

    [XmlAttribute(AttributeName = "myattr")] 
    public string Name { get; set; } 
} 
+0

"Member 'Items' vom Typ System.Object können nicht serialisiert werden. XmlAttribute/XmlText kann nicht zum Codieren komplexer Typen verwendet werden." – user377486

+0

Es ist ein anderes Problem, das Sie vermeiden, weil der Serializer Ihr Element ignoriert. Sie müssen einen echten Typ für die Auflösung definieren, z. Zeichenfolge –

1

Alternative Lösung: ein Array verwenden statt einer Liste und XmlElement

[XmlType(TypeName = "classmy")] 
    public class MyClass2 
    { 
     [XmlElement(ElementName = "Items")] 
     public object[] Items { get; set; } 
     [XmlAttribute(AttributeName = "myattr")] 
     public string Name { get; set; } 
    } 
1

XmlSerializer behandelt Liste <> in besonderer Weise:

XmlSerializer kann clas verarbeiten ses, die IEnumerable oder ICollection anders implementieren, wenn sie bestimmte Anforderungen erfüllen. Eine Klasse, die IEnumerable implementiert, muss eine öffentliche Add-Methode implementieren, die einen einzelnen Parameter akzeptiert. Der Parameter der Add-Methode muss konsistent (polymorph) mit dem Typ sein, der von der IEnumerator.Current-Eigenschaft zurückgegeben wird, die von der GetEnumerator-Methode zurückgegeben wird. Eine Klasse, die ICollection zusätzlich zu IEnumerable (z. B. CollectionBase) implementiert, muss über eine öffentliche Item-indizierte Eigenschaft (einen Indexer in C#) verfügen, die eine ganze Zahl annimmt und eine öffentliche Count-Eigenschaft vom Typ integer haben muss. Der Parameter, der an die Add-Methode übergeben wird, muss vom Typ sein, der von der Item-Eigenschaft oder einer der Basistypen dieses Typs zurückgegeben wird. Bei Klassen, die ICollection implementieren, werden Werte, die serialisiert werden sollen, aus der indizierten Item-Eigenschaft und nicht durch Aufrufen von GetEnumerator abgerufen. Beachten Sie außerdem, dass öffentliche Felder und Eigenschaften nicht serialisiert werden, mit Ausnahme von öffentlichen Feldern, die eine andere Auflistungsklasse zurückgeben (eine, die ICollection implementiert). MSDN - scroll to XML Serialization Considerations

Deshalb hat es Ihre Klasse als eine Liste von Objekten nur ohne Ihr Eigentum serialisiert. Die beste Lösung besteht darin, List als öffentliche Klasse der Klasse aufzunehmen und sie als XmlElement zu kennzeichnen.