如何解决XML 反序列化因嵌套类内部类而失败
编辑
我在反序列化包含内部类(或嵌套类)的 XML 文件时遇到问题。
我有以下类图:
[XmlRoot(ElementName = "HM")]
public class OwnClass : BaseClass{
...
public OwnClass(){} // default constructor
...
}
我有以下 _xmlMessageFormatter
声明(基于 System.Messaging
):
this._xmlMessageFormatter = new System.Messaging.XmlMessageFormatter();
System.Type[] OwnTypes = new System.Type[30];
OwnTypes[0] = typeof(Baseclasses.OwnClass); /* TR */
...
this._xmlMessageFormatter.TargetTypes = OwnTypes;
编辑:这是 XML 的样子:
<?xml version="1.0"?>
<HM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>124</ID>
<TC>TR</TC>
</HM>
所有这些都运行良好。
现在我在 OwnClass
的定义中添加一个新类:
[XmlRoot(ElementName = "HM")]
public class OwnClass : BaseClass {
[XmlElement(ElementName = "INS")]
public ClassInside f_Inside;
...
public OwnClass(){} // default constructor
...
public class ClassInside{
...
public class ClassInside(){}
...} // end of ClassInside
} // end of OwnClass
我还添加了相应的目标类型:
OwnTypes [27] = typeof(BaseClasses.OwnClass.ClassInside); // the number of the array is correct.
编辑:XML 文件现在如下所示:
<?xml version="1.0"?>
<HM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>125</ID>
<TC>TR</TC>
<TR>
<ID>1</ID>
<CD>MOVE</CD>
</TR>
</HM>
_xmlMessageFormatter
无法处理 de 序列化,正如您在此处看到的:
源代码:
Object temp;
temp = this._xmlMessageFormatter.Read(message);
为了获得更多信息,我在即时窗口中输入了 ? temp = this._xmlMessageFormatter.Read(message);
(我正在使用 Visual Studio),这就是我得到的:
'temp = this._xmlMessageFormatter.Read(message)' threw an exception of type 'System.InvalidOperationException'
Data: {System.Collections.ListDictionaryInternal}
HResult: -2146233079
HelpLink: null
InnerException: {"There was an error reflecting field 'f_Inside'."}
Message: "There was an error reflecting type 'BaseClasses.AnotherClass'."
Source: "System.Xml"
StackTrace: " at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model,String ns,ImportContext context,String dataType,XmlAttributes a,Boolean repeats,Boolean openModel,RecursionLimiter limiter)\r\n at
System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model,XmlRootAttribute root,String defaultNamespace,RecursionLimiter limiter)\r\n at
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type,String defaultNamespace)\r\n at
System.Xml.Serialization.XmlSerializer..ctor(Type type,String defaultNamespace)\r\n at
System.Messaging.XmlMessageFormatter.CreateTargetSerializerTable()\r\n at
System.Messaging.XmlMessageFormatter.Read(Message message)"
TargetSite: {System.Xml.Serialization.TypeMapping ImportTypeMapping(System.Xml.Serialization.TypeModel,System.String,ImportContext,System.Xml.Serialization.XmlAttributes,Boolean,System.Xml.Serialization.RecursionLimiter)}
我对错误消息有两个问题:
- 它提到了
f_Inside
。这看起来是正确的,但我已经使用f_Inside
作为所有类的通用字段名,以及我提到这一点的原因: - 在我发送
AnotherClass
形式的消息时,它提到了OwnClass
。
=> 我严重怀疑错误消息的正确性。有没有人知道我现在可以做什么(或者 _xmlFormatter
是如何工作的?)
编辑:添加背景
所有这些都是消息服务的一部分:一个应用程序正在发送消息,另一个应用程序正在接收它(使用 System.Messaging.MessageQueue
对象)。序列化/反序列化只是其中的一部分。
提前致谢
解决方法
问题已解决,与嵌套类的反序列化无关:
在我的一个课程 (AgainAnotherClass
) 中,我有以下源代码:
[XmlElement(ElementName = "SA")]
[XmlElement(ElementName = "SA")]
public string SomeAttribute { get; set; }
(复制/粘贴的典型案例)
我有两行带有 XmlElement
的事实导致了问题。
异常如下所示:
InnerException: {"There was an error reflecting field 'f_Inside'."}
Message: "There was an error reflecting type '<NameSpace>.AgainOtherClass'."
InnerException
使我相信嵌套类有问题,而 Message
谈论的是一个完全不同的类。我决定跟随InnerException
。
那是错误的!因此,如果出现 InnerException
和 Message
相互矛盾的 C# 异常,请先检查 Message
,然后(可能)检查 InnerException
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。