如何控制复杂对象的反序列化

Mr *_*ubs 6 .net xml vb.net serialization

我称第三方Web服务返回大量XML数据(大约2mb),我想以比正常更受控制的方式将其反序列化为对象.这是xml:

<vehicle>
  <vehicleManufacturer>
    <type>1</type>
    <name>A Make</name>
  </vehicleManufacturer>
...
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用下面的代码来控制哪些元素被序列化到哪些属性,在这种情况下,Car Make对象包含两个属性,类型和名称.

    <System.Xml.Serialization.XmlElement("vehicleManufacturer")> _
    Public Property Make() As CarMake
Run Code Online (Sandbox Code Playgroud)

但是,如果可能的话,我希望能够将名称字段反序列化为Make属性,或者甚至将整个元素及其内容序列化为文本.

    <System.Xml.Serialization.XmlElement("vehicleManufacturer")> _
    Public Property Make() As String
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的例子,所以如果有任何资源可以帮助我,那就太棒了.

另一个例子:

<vehicle>
  <warrantyDetail>
    <warrantyBasicInformation buildStartdate="09/07/2013" warrantyStartDate="31/07/2013"/>
  </warrantyDetail>
</vehicle>
Run Code Online (Sandbox Code Playgroud)

我想从warrantyBasicInformation中获取属性,而无需构建保修详细信息和warrantyBasicInformation对象.

请注意,这种事情通常是从WSDL生成的,但是,我不会提供一个,我没有XSD,并且尝试生成一个失败.我也知道我可以实现ISerializable并使用xml阅读器或linq,但同样,这可能会变成很多代码,也许很难维护.

Mr *_*ubs 0

我有一种感觉,这是一种代码味道,但这是我想出的最简单的方法。(它假设节点将存在等,在这种情况下是可以的。)

Using tr As IO.TextReader = New IO.StringReader(strResult)

  Using reader As System.Xml.XmlReader = System.Xml.XmlReader.Create(tr)

    reader.MoveToContent()

    While reader.Read

      If reader.NodeType = Xml.XmlNodeType.Element Then

        Select Case reader.Name

          Case "warrantyDetail"

            Dim xel As XElement = CType(XNode.ReadFrom(reader), Xml.Linq.XElement)

            If xel IsNot Nothing Then

              vi.RegCountry = xel.Element("country").Element("name").Value
              vi.Reg = xel.Element("registration").Value
              xel.Element("warrantyBasicInformation").Attribute("buildStartdate").Value
              xel.Element("warrantyBasicInformation").Attribute("buildStartdate").Value
              ...

            End If

          Case ...

        End Select
      End If    
    End While
  End Using
End Using
Run Code Online (Sandbox Code Playgroud)