开发者

XmlSerializer + Polymorphism

Given a (contrived) base class, and a sub class we want to serialize via WCF using the XmlSerializer. We decorate a collection (see the response class) as per the article:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.aspx (see remarks section).

Issue is that although the correct WSDL seems to be generated, SVCUtil generates a class file where the GetUserResponse class contains a property named Items. Is this to do with applying [XmlElement] to an array? Although the XmlArray element doesn't have a Type property.

Thanks in advance.

[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 {ge开发者_Python百科t;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;}
}


Because you are using [XmlElement] on the collection property, the corresponding xml is going to be something like:

<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>

there isn't really anywhere it can get a better name for a collection property, other than Items. I wonder if it might be better to use:

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

in order to build:

<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>

then you would have a Users property.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜