【发布时间】:2013-12-17 12:45:27
【问题描述】:
如何从一个公共对象转换为 Web 服务对象(相同的对象但不同的命名空间 - Web 服务代理更改命名空间),以及如何使用 Xml 序列化从 Web 服务转换为公共对象。
下面的代码没有例外,但是反序列化的对象属性设置为它们的默认值,而不是它们应该具有的值。正如@Mark Gravel 在下面的答案中指出的那样,这是因为当您序列化到 Web 服务对象时,它会添加额外的 Xml 命名空间。
我尝试了多种方法,例如使用 Xml.Serialization.XmlSerializerNamespaces 并在序列化时设置默认命名空间,但我要么得到相同的结果,要么做错了事,并在反序列化时出现 Xml 错误。
我意识到这比直接映射对象属性要慢(性能),但它非常大,我想让原型快速运行而不必每次都转换对象。有没有办法在反序列化之前完全删除命名空间并在序列化时添加命名空间? - 添加和删除xmlns="http://[host.co.uk]/ 位的结构化方式。
请注意,Web 服务归第三方所有(因此无法更改该代码),并且该对象没有特殊的 Xml 修饰。涉及多个 Web 服务,因此命名空间将在运行时根据服务 URL 发生变化。
要序列化,我使用以下代码:
Dim serializer As New Xml.Serialization.XmlSerializer(requestParams.GetType)
Using strWriter As New IO.StringWriter()
serializer.Serialize(strWriter, requestParams)
Return strWriter.ToString
End Using
要反序列化,我使用以下代码:
Dim serializer As New XmlSerializer(GetType(T))
Using strReader As New IO.StringReader(serializedXml)
Return DirectCast(serializer.Deserialize(strReader), T)
End Using
供参考,序列化的普通对象:
<?xml version="1.0" encoding="utf-16"?>
<SearchPartsRequest>
<LocationCode>01</LocationCode>
<PartCriteria>
<PartNo>1064762</PartNo>
</PartCriteria>
<WildCardSearch>false</WildCardSearch>
</SearchPartsRequest>
序列化的网络服务对象:
<?xml version="1.0" encoding="utf-16"?>
<SearchPartsRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LocationCode xmlns="http://host.co.uk/">01</LocationCode>
<PartCriteria xmlns="http://host.co.uk/">
<PartNo>1064762</PartNo>
</PartCriteria>
</SearchPartsRequest>
【问题讨论】:
标签: .net web-services xml-serialization .net-2.0