c# – 当元素可能是许多可能元素之一时,将XML元素反序列化为Object
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 当元素可能是许多可能元素之一时,将XML元素反序列化为Object,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1889字,纯文字阅读大概需要3分钟。
内容图文
![c# – 当元素可能是许多可能元素之一时,将XML元素反序列化为Object](/upload/InfoBanner/zyjiaocheng/769/d7ffbb2a5bca4200a0454326482e4b8e.jpg)
在通过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方法过载.
我缺少一个优雅的解决方案吗?或者至少是一个不涉及无限开关语句的解决方案?
解决方法:
内容总结
以上是互联网集市为您收集整理的c# – 当元素可能是许多可能元素之一时,将XML元素反序列化为Object全部内容,希望文章能够帮你解决c# – 当元素可能是许多可能元素之一时,将XML元素反序列化为Object所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。