XML 反序列化因嵌套 类(内部 类)而失败
XML deserialisation fails with nested classes (inner classes)
编辑
我在 de 序列化一个包含内部 classes(或嵌套 classes)的 XML 文件时遇到问题。
我有以下 class 图:
[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
的定义中添加一个新的 class:
[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);
为了获得更多信息,我在 window 中输入了 ? 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, XmlRootAttribute root, 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.String,
System.Xml.Serialization.XmlAttributes,
Boolean,
Boolean,
System.Xml.Serialization.RecursionLimiter)}
错误消息有两个问题:
- 它提到了
f_Inside
。这看起来是正确的,但我使用 f_Inside
作为我所有 classes 的通用字段名,我提到这个的原因是:
- 它提到
AnotherClass
而我已经发送了 OwnClass
. 格式的消息
=> 我严重怀疑错误消息的正确性。有没有人知道我现在可以做什么(或者 _xmlFormatter
是如何工作的?)
编辑:添加背景
所有这些都是消息服务的一部分:一个应用程序发送消息,另一个应用程序接收消息(使用 System.Messaging.MessageQueue
对象)。 serialisation/deserialisation只是其中的一部分。
提前致谢
问题已解决,与嵌套classes的反序列化无关:
在我的 classes (AgainAnotherClass
) 之一中,我有以下源代码:
[XmlElement(ElementName = "SA")]
[XmlElement(ElementName = "SA")]
public string SomeAttribute { get; set; }
(Copy/Paste的典型案例)
我有两行 XmlElement
导致了问题。
异常如下所示:
InnerException: {"There was an error reflecting field 'f_Inside'."}
Message: "There was an error reflecting type '<NameSpace>.AgainOtherClass'."
InnerException
让我相信嵌套的 class 有问题,而 Message
谈到了完全不同的 class。我决定按照InnerException
.
那是错误的!因此,在 InnerException
和 Message
相互矛盾的 C# 异常情况下,首先检查 Message
,然后(可能)检查 InnerException
.
编辑
我在 de 序列化一个包含内部 classes(或嵌套 classes)的 XML 文件时遇到问题。
我有以下 class 图:
[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
的定义中添加一个新的 class:
[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);
为了获得更多信息,我在 window 中输入了 ? 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, XmlRootAttribute root, 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.String,
System.Xml.Serialization.XmlAttributes,
Boolean,
Boolean,
System.Xml.Serialization.RecursionLimiter)}
错误消息有两个问题:
- 它提到了
f_Inside
。这看起来是正确的,但我使用f_Inside
作为我所有 classes 的通用字段名,我提到这个的原因是: - 它提到
AnotherClass
而我已经发送了OwnClass
. 格式的消息
=> 我严重怀疑错误消息的正确性。有没有人知道我现在可以做什么(或者 _xmlFormatter
是如何工作的?)
编辑:添加背景
所有这些都是消息服务的一部分:一个应用程序发送消息,另一个应用程序接收消息(使用 System.Messaging.MessageQueue
对象)。 serialisation/deserialisation只是其中的一部分。
提前致谢
问题已解决,与嵌套classes的反序列化无关:
在我的 classes (AgainAnotherClass
) 之一中,我有以下源代码:
[XmlElement(ElementName = "SA")]
[XmlElement(ElementName = "SA")]
public string SomeAttribute { get; set; }
(Copy/Paste的典型案例)
我有两行 XmlElement
导致了问题。
异常如下所示:
InnerException: {"There was an error reflecting field 'f_Inside'."}
Message: "There was an error reflecting type '<NameSpace>.AgainOtherClass'."
InnerException
让我相信嵌套的 class 有问题,而 Message
谈到了完全不同的 class。我决定按照InnerException
.
那是错误的!因此,在 InnerException
和 Message
相互矛盾的 C# 异常情况下,首先检查 Message
,然后(可能)检查 InnerException
.