views:

686

answers:

1

I have a class that is inherited from List<T> and also has some properties, like this:

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

This class is serialized to xml as part of a larger class:

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

The problem is, serializer sees my list as a collection; the resulting XML contians only list elements, but not class properties (FinalDropCount in this case). This is an example of outputted XML:

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

Is there some way to save both list contents and properties without resorting to implementing IXmlSerializable by hand?

A: 

You have other alternatives that you can consider.

Alternative one - Move to composition instead of inheritance:

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 two - Move the properties outside the collection:

public class DropList : List<DropItem>
{
}

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

    [XmlAttribute]
    public int FinalDropCount { get; set; }
}
João Angelo
That's what I am doing now. But semantically it is better to have a DropList that _is_ a List - if that is at all possible.
Nevermind