【发布时间】:2015-06-11 20:45:19
【问题描述】:
我的问题是将 xml 反序列化为 c# 对象。我有一些从其他类派生的类(我有理由需要在这个地方使用继承——不管为什么):
[Serializable]
[XmlType(TypeName = "OTA_HotelResRQ")]
public class ResRQ : OTA_HotelResRQ
{
}
在 OTA_HotelResRQ 我已经声明了命名空间和其他信息:
[Serializable]
[XmlTypeAttribute(Namespace = "http://www.opentravel.org/OTA/2003/05")]
[XmlRootAttribute(Namespace = "http://www.opentravel.org/OTA/2003/05", IsNullable = false)]
public class OTA_HotelResRQ : OtaRequestMessage, IRequest
当我尝试序列化一些如下所示的请求时:
<ns:OTA_HotelResRQ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="http://www.opentravel.org/OTA/2003/05"
PrimaryLangID="en" EchoToken="5613971064477293649" ResStatus="Commit" Version="2.1">
...SOME REQUEST WITH NS:....
<ns:POS><ns:/POS>
现在当我尝试反序列化时,我有:
There is an error in XML document (3, 2). ---> System.InvalidOperationException: <OTA_HotelResRQ xmlns='http://www.opentravel.org/OTA/2003/05'> was not expected.
你知道为什么我不能反序列化吗?我不能为我的模型修改基类,而且我需要有“ns”前缀,因为我要发送的服务需要这种格式。
更新:
我的反序列化已实现,我从字符串中获取字节并尝试使用以下方法进行反序列化:
return (T) new XmlSerializer(typeof (T)).Deserialize(new MemoryStream(bytes));
我尝试使用 Charles 提供的解决方案修复它并更新了我的模型:
[Serializable]
[XmlRoot("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
[XmlType("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class ResRQ : OTA_HotelResRQ
{
}
但仍然没有成功。当我尝试反序列化时,我得到了异常:
Types 'OTA_HotelResRQ' and
'ResRQ' both use the XML type name,
'OTA_HotelResRQ', from namespace 'http://www.opentravel.org/OTA/2003/05'. Use
XML attributes to specify a unique XML name and/or namespace for the type.
【问题讨论】:
-
“我需要有“ns”前缀,因为我要发送的服务需要这种格式”——除非服务写得很糟糕,否则你不需要。命名空间前缀对于特定的 XML 文档是本地的。这两段 XML
<a:thing xmlns:a="http://example.com"/>和<b:thing xmlns:b="http://example.com"/>应该 被同等对待。 (应该<thing xmlns="http://example.com"/>) -
不错,需要前缀
-
是的,很糟糕,如果它依赖于 specific 前缀。正如我所说,前缀应该只在本地有意义。重要的是命名空间本身(我之前评论中的所有三个示例都是来自
http://example.com命名空间的thing元素) -
ok 没关系。我可以删除这个派生类,但我仍然遇到与 OTA_HotelResRQ xmlns='opentravel.org/OTA/2003/05'> 预期相同的错误
-
好的,我更改了类型名称,然后出现了问题。现在它正在工作,我可以使用 ns 前缀创建和反序列化请求。我不知道如何使用派生类来做到这一点,但在这种情况下不再需要这样做。感谢您的帮助
标签: c# serialization xml-namespaces xml-deserialization