Csharp/C#教程:序列化数组时如何使用XmlAttributeOverrides?分享


序列化数组时如何使用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

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐