2010-02-24 5 views
3

J'ai une classe qui est héritée de List<T> et a aussi des propriétés, comme ceci:Comment sérialiser tableau XML et propriétés de classe en utilisant C# sérialisation XML

[Serializable] 
public class DropList : List<DropItem> 
{ 
    [XmlAttribute] 
    public int FinalDropCount{get; set;} 
} 

Cette classe est sérialisé en XML dans le cadre d'un plus grande classe:

[Serializable] 
public class Location 
{ 
    public DropList DropList{get; set;} 
    .... 
} 

Le problème est, serializer voit ma liste comme une collection; les contians XML résultants ne listent que les éléments, mais pas les propriétés de la classe (FinalDropCount dans ce cas). Ceci est un exemple de XML en sortie:

<Location xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <DropList> 
     <DropItem ProtoId="3" Count="0" Minimum="0" Maximum="0" /> 
     <DropItem ProtoId="4" Count="0" Minimum="0" Maximum="0" /> 
    </DropList> 
    .... 
</Location> 

Est-il possible de sauver les deux contenu de la liste et les propriétés sans avoir recours à la mise en œuvre IXmlSerializable à la main?

+0

Pourquoi voulez-vous sérialiser les propriétés? Habituellement, ce qui vous intéresse, ce sont les données contenues dans la classe, c'est-à-dire les valeurs actuelles de toutes les variables. Les propriétés sont juste un moyen d'accéder à ces valeurs. Pouvez-vous clarifier? – Roast

+0

Ces propriétés font partie des données. Pensez-y de cette façon: DropList est une liste de DropItems avec des données attachées, comme FinalDropCount. Donc, je dois sauvegarder et charger toutes les données - liste et propriétés. – Nevermind

Répondre

2

Vous avez d'autres alternatives que vous pouvez envisager.

Alternative un - Déplacer à la composition au lieu de l'héritage:

public class DropInfo 
{ 
    [XmlArray("Drops")] 
    [XmlArrayItem("DropItem")] 
    public List<DropItem> Items { get; set; } 

    [XmlAttribute] 
    public int FinalDropCount { get; set; } 
} 

public class Location 
{ 
    public DropInfo DropInfo { get; set; } 
} 

Alternative deux - Déplacer les propriétés en dehors de la collection:

public class DropList : List<DropItem> 
{ 
} 

public class Location 
{ 
    public DropList DropList { get; set; } 

    [XmlAttribute] 
    public int FinalDropCount { get; set; } 
} 
+0

C'est ce que je fais maintenant. Mais sémantiquement, il est préférable d'avoir une liste déroulante qui est _is_ une liste - si cela est possible. – Nevermind