Gerald Hughes
Gerald Hughes

Reputation: 6159

XmlSerializer - Element name for generic list class

I am trying to serialize an object to XML using XmlSerializer

I am expecting to get something like this:

<User>
    <username>administrator</username>
    <email>[email protected]</email>
        <roles>
            <whatever id="D3DCBCDA-AD61-4764-B5A1-057D654F1C26">
                <role>admin</role>
            </whatever>
        </roles>
</user>

But instead I'm getting this:

<User>
    <username>administrator</username>
    <email>[email protected]</email>
    <roles>
        <RoleDTO id="D3DCBCDA-AD61-4764-B5A1-057D654F1C26">
            <role>admin</role>
        </RoleDTO>
    </roles>
</User>

Code

XmlSerializer x = new System.Xml.Serialization.XmlSerializer(xml.GetType());
XmlSerializer xsSubmit = new XmlSerializer(typeof(UserDTO));
StringWriter sww = new StringWriter();
XmlWriter writer = XmlWriter.Create(sww);
xsSubmit.Serialize(writer, user);
var xmll = sww.ToString(); // My xml


List<RoleDTO> rl = new List<RoleDTO>();

        rl.Add(new RoleDTO { roleId = new Guid("D3DCBCDA-AD61-4764-B5A1-057D654F1C26"), role = "admin" });


UserDTO user = new UserDTO 
             {
                username = "administrator",
                email = "[email protected]",
                role = rl
             };

Model

namespace Model.DTO
{
    [XmlRoot("User")]
    public class UserDTO
    {
        public string username { get; set; }
        public string email { get; set; }
        public List<RoleDTO> role { get; set; }
    }

    public class RoleDTO
    {
        [XmlAttribute("Id")]
        public Guid roleId { get; set; }
        public string role { get; set; }
    }
}

I tried to decorate class RoleDTO with [XmlRoot("whatever")] , [XmlElement("whatever")] without succes.

Any ideas?

Upvotes: 1

Views: 493

Answers (1)

Mehrzad Chehraz
Mehrzad Chehraz

Reputation: 5147

You need to decorate the role property of the User DTO class with

[XmlElement("whatever")] 

not the RoleDTO class.

public class UserDTO
{
    public string username { get; set; }
    public string email { get; set; }
    [XmlElement("whatever")] 
    public List<RoleDTO> role { get; set; }
}

Upvotes: 1

Related Questions