XmlSerializer + Polymorphism

删除回忆录丶 提交于 2019-11-28 05:05:04

问题


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


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.



来源:https://stackoverflow.com/questions/4260338/xmlserializer-polymorphism

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!