两种类型(通用和Web服务类型)之间的XML序列化

Shoubs先生

如何使用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>
Shoubs先生

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章