ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 当元素可能是许多可能元素之一时,将XML元素反序列化为Object

2019-07-10 05:05:17  阅读:269  来源: 互联网

标签:c casting xml xml-serialization xmlreader


在通过pub / sub以XML格式传输消息的本地框架内,我需要能够使用大量消息,但是,所有消息都是作为简单文本接收的,必须反序列化为Xsd工具创建的对象.

消息本身都是从一个基本的MessageType元素/对象派生的,但是如果我基于它反序列化就像这样:

XmlSerializer serializer = new XmlSerializer(typeof(MessageType));
XmlReader reader = XmlReader.Create(new StringReader(rawMessage));
MessageType message = (MessageType)serializer.Deserialize(reader);

我收到一个错误,说实际的元素类型(“UpdateParameter”说)不是预期的.

目前,我能想到的唯一解决方案是使用switch语句:

XmlReader reader = XmlReader.Create(new StringReader(upString));
reader.MoveToContent();
switch (reader.LocalName.ToLower())
{
   case "updateparameter":
      serializer = new XmlSerializer(typeof(UpdateParameter));
      doStuff((UpdateParameter)serializer.Deserialize(xml));
      break;
   case "updateparameterresponse":
      serializer = new XmlSerializer(typeof(UpdateParameterResponse));
      doStuff((UpdateParameterResponse)serializer.Deserialize(xml));
      break;
   case "UpdateStatusResponse":
      serializer = new XmlSerializer(typeof(UpdateStatusResponse));
      doStuff((UpdateStatusResponse)serializer.Deserialize(xml));
      break;
//...etc. Repeat for all possible elements
}

但如果有一个优雅的解决方案,我真的不愿意这样做.我想做的就像是

Type rootType = Type.GetType(reader.localName);// could work if name is right
serializer = new XmlSerializer(typeof(rootType)); // would work
doStuff((rootType)serializer.Deserialize(xml)); // won't work

但正如评论所指出的那样,它至少不起作用,因为您似乎无法使用类型变量进行转换.此外,当xml元素的localName与Object的本地名称匹配时,上面的方法需要(据我所知)组装限定名称,这是另一个野兽.请注意,理想情况会使doStuff方法过载.

我缺少一个优雅的解决方案吗?或者至少是一个不涉及无限开关语句的解决方案?

解决方法:

在问题How do I use an XmlSerializer to deserialize an object that might be of a base or derived class without knowing the type beforehand?中讨论了相同的问题.

My answer here

标签:c,casting,xml,xml-serialization,xmlreader
来源: https://codeday.me/bug/20190710/1420764.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有