我的问题是将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.
答案 0 :(得分:0)
XML属性are not inherited,因此您需要在派生类中添加XmlRoot
属性:
[Serializable]
[XmlRoot("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class ResRQ : OTA_HotelResRQ
{
}