XmlSerializer + Полиморфизм - PullRequest
       8

XmlSerializer + Полиморфизм

3 голосов
/ 23 ноября 2010

Учитывая (надуманный) базовый класс и подкласс, который мы хотим сериализовать через WCF, используя XmlSerializer. Мы украшаем коллекцию (см. Класс ответа) согласно статье:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.aspx (см. Раздел «Примечания»).

Проблема в том, что, хотя правильный WSDL, по-видимому, генерируется, SVCUtil создает файл класса, в котором класс GetUserResponse содержит свойство с именем Items. Это связано с применением [XmlElement] к массиву? Хотя элемент XmlArray не имеет свойства Type.

Заранее спасибо.

[Serializable]
[XmlType]
public class UserBase
{
    public int Id {get;set;}
}

[Serializable]
[XmlType]
public class BasicUser : UserBase
{
    public string UserName {get;set;}
}

[Serializable]
[XmlType]
public class SuperUser : UserBase
{
    public string UserName {get;set;}
    public bool SpecialLevel {get;set;}

}

[Serializable]
[XmlType]
public class GetUserResponse
{
    [XmlElement("Users", typeof(User)), XmlElement("SuperUsers", typeof(SuperUser))]
    public List<UserBase> Users {get;set;}
}

1 Ответ

7 голосов
/ 23 ноября 2010

Поскольку вы используете [XmlElement] в свойстве коллекции, соответствующий xml будет выглядеть примерно так:

<GetUserResponse>
    <Users>{this is a user}</Users>
    <Users>{this is a user}</Users>
    <SuperUsers>{this is a super user}</SuperUsers>
    <Users>{this is a user}</Users>
    <SuperUsers>{this is a super user}</SuperUsers>
</GetUserResponse>

на самом деле нигде нет лучшего названия свойства collection , кроме Items. Интересно, может быть лучше использовать:

[XmlArray("Users")]
[XmlArrayItem("User", typeof(User))]
[XmlArrayItem("SuperUser", typeof(SuperUser))]

чтобы построить:

<GetUserResponse>
    <Users>
        <User>{this is a user}</User>
        <User>{this is a user}</User>
        <SuperUser>{this is a super user}</SuperUser>
        <User>{this is a user}</User>
        <SuperUser>{this is a super user}</SuperUser>
    </Users>
</GetUserResponse>

тогда у вас будет свойство Users.

...