序列化数组时如何使用XmlAttributeOverrides?
我有一个名为_updatedComponents的数组,这些对象属于NetworkComponent类。 我必须以更改根元素(=数组)的名称和命名空间以及将单个NetworkComponent-item的名称更改为组件的方式对其进行序列化。 我有一个下面的代码导致exception:
System.InvalidOperationException:存在反映类型’ComponentSyncService.NetworkComponent []’的错误。 —> System.InvalidOperationException:可能没有为ComponentSyncService.NetworkComponent []类型指定XmlRoot和XmlType属性。
码:
XmlAttributeOverrides xaos = new XmlAttributeOverrides(); // the array itself aka the root. change name and namespace XmlElementAttribute xea = new XmlElementAttribute(_updatedComponents.GetType()); xea.Namespace = "https://www.example.com/nis/componentsync"; xea.ElementName = "components"; XmlAttributes xas = new XmlAttributes(); xas.XmlElements.Add(xea); xaos.Add(_updatedComponents.GetType(), xas); // then the items of the array. just change the name xea = new XmlElementAttribute(typeof(networkcomponent)); xea.ElementName = "component"; xas = new XmlAttributes(); xas.XmlElements.Add(xea); xaos.Add(typeof(NetworkComponent), "NetworkComponent", xas); XmlSerializer serializer = new XmlSerializer(_updatedComponents.GetType(), xaos); XmlTextWriter writer = new XmlTextWriter(string.Format("{0}\ComponentSyncWS_{1}.xml", Preferences.FileSyncDirectory, requestId), Encoding.UTF8); serializer.Serialize(writer, _updatedComponents);
什么是_updatedComponents
? 我猜它是一个NetworkComponent[]
– 这将使事情变得非常棘手。 我建议写一个包装类型:
public class ComponentsMessage { public NetworkComponent[] Components {get;set;} }
然后,您可以关联正确的属性。 如果你需要在NetworkComponent
上支持ad-hoc属性,你仍然需要使用属性覆盖(因此我根本没有对上面的内容进行修饰),但ComponentsMessage
应该乐于接受属性。
或者,只需编写单独的DTO并映射值。
如果它很简单,您可能只能使用:
[XmlRoot("components", Namespace = XmlNamespace)] [XmlType("components", Namespace = XmlNamespace)] public class ComponentsMessage { public const string XmlNamespace = "https://www.example.com/nis/componentsync"; [XmlElement("component")] public NetworkComponent[] Components { get; set; } }
或者,如果必须使用属性覆盖,我仍然使用包装器对象:
上述就是C#学习教程:序列化数组时如何使用XmlAttributeOverrides?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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 = "https://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); } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1008120.html