What are _updatedComponents ? I guess this is NetworkComponent[] , which will make things very complex. I would suggest writing a shell type:
public class ComponentsMessage { public NetworkComponent[] Components {get;set;} }
Then you can link the correct attributes. If you need to support ad-hoc attributes on NetworkComponent , you still have to use attribute overrides (hence, I didn't decorate it at all above), but ComponentsMessage should happily accept attributes.
Alternatively, just write a separate DTO and map the values.
If it's simple, you can simply use:
[XmlRoot("components", Namespace = XmlNamespace)] [XmlType("components", Namespace = XmlNamespace)] public class ComponentsMessage { public const string XmlNamespace = "http://www.example.com/nis/componentsync"; [XmlElement("component")] public NetworkComponent[] Components { get; set; } }
Alternatively, if you must use override attributes, I will still use a wrapper object:
public class ComponentsMessage { public NetworkComponent[] Components { get; set; } } class Program { static void Main() { NetworkComponent[] _updatedComponents = new NetworkComponent[2] { new NetworkComponent{},new NetworkComponent{} }; const string XmlNamespace = "http://www.example.com/nis/componentsync"; XmlAttributeOverrides ao = new XmlAttributeOverrides(); ao.Add(typeof(ComponentsMessage), new XmlAttributes { XmlRoot = new XmlRootAttribute("components") { Namespace = XmlNamespace }, XmlType = new XmlTypeAttribute("components") { Namespace = XmlNamespace } }); ao.Add(typeof(ComponentsMessage), "Components", new XmlAttributes { XmlElements = { new XmlElementAttribute("component") } }); ComponentsMessage msg = new ComponentsMessage { Components = _updatedComponents }; XmlSerializer serializer = new XmlSerializer(msg.GetType(), ao); serializer.Serialize(Console.Out, msg); } }
Marc gravell
source share