反序列化xml。的xmlns =' HTTP // someaddress'没想到

时间:2015-06-10 11:54:48

标签: c# serialization xml-namespaces xml-deserialization

我的问题是将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.

你知道为什么我不能反序化这个吗?我不能修改我的模型的基类,我也需要&#34; ns&#34;前缀,因为我要发送的服务需要这种格式。

更新:

我实现了反序列化,我从字符串中获取字节并尝试使用以下命令反序列化:

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.

1 个答案:

答案 0 :(得分:0)

XML属性are not inherited,因此您需要在派生类中添加XmlRoot属性:

[Serializable]
[XmlRoot("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class ResRQ : OTA_HotelResRQ
{
}