gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:13:19 28 4
gpt4 key购买 nike

在本地框架中,消息通过发布/订阅以 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 rightserializer = new XmlSerializer(typeof(rootType)); // would workdoStuff((rootType)serializer.Deserialize(xml)); // won't work

但正如评论所述,它至少不起作用,因为您似乎无法使用类型变量进行转换。此外,虽然 xml 元素的 localName 确实匹配对象的本地名称,但上面的方法需要(据我所知)程序集限定名称,这完全是另一个野兽。请注意,理想情况下会重载 doStuff 方法。

我是否缺少一个优雅的解决方案?或者至少是一个不涉及无穷无尽的 switch 语句的解决方案?

最佳答案

关于c# - 当元素可能是许多可能元素之一时,将 XML 元素反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798928/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com