如何使用Xml序列化从通用对象转换为Web服务对象(相同的对象但名称空间不同-Web服务代理更改名称空间),以及如何从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>
序列化的Web服务对象:
<?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>
System.Xml.Serialization.XmlAttributes.Xmlns = False
是关键。
这是一个例子:
Dim atts As New System.Xml.Serialization.XmlAttributes()
' Set to true to preserve namespaces, or false to ignore them.
atts.Xmlns = False
Dim xover As New System.Xml.Serialization.XmlAttributeOverrides()
' Add the XmlAttributes and specify the name of
' the element containing namespaces.
xover.Add(secCred.GetType, String.Empty, atts)
Dim serializer As New System.Xml.Serialization.XmlSerializer(secCred.GetType, xover)
Using strWriter As New IO.StringWriter()
serializer.Serialize(strWriter, secCred)
xml = strWriter.ToString
End Using
该字符串xml
将包含(注意xmlns="http://host.co.uk/"
已删除),并且可以反序列化为常见的对象类型:
<SearchPartsRequest>
<LocationCode>01</LocationCode>
<PartCriteria>
<PartNo>1064762</PartNo>
</PartCriteria>
<WildCardSearch>false</WildCardSearch>
</SearchPartsRequest>
反序列化似乎无关紧要,您可以照常执行此操作,因为将为您自动添加名称空间(如果您要在何处再次进行序列化)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句