谁能向我解释反序列化如何将XML数据转换为对象?

时间:2012-10-07 06:44:41

标签: xml vb.net xml-serialization

我正在开发一个项目,我必须将从XML文件中读取的数据保存到数据库中,我已经使用了我制作的代码,但它有点原始,我正在使用XMLTextReader和其他一些浏览文件中的代码行并读取我想要的数据的方法,但是我已经读过如果我在程序中使用序列化这将会“更容易”,现在我已经看到了一些这样的例子和老实说还没有完全理解它们,以前从未听说过它们,所以如果有人能够一般性地向我解释并提供一些关于我如何将它应用到我的项目中的例子那就太棒了。

这就是我现在所拥有的:

For y As Integer = 0 To 167
            Dim reader1 As XmlTextReader = New XmlTextReader(dir)

            reader1.ReadStartElement("response")
            reader1.ReadToNextSibling("hourly_forecast")
            reader1.ReadStartElement("hourly_forecast")
            reader1.ReadToNextSibling("forecast")
            reader1.ReadStartElement("forecast")

            CurrentLine= reader1.LineNumber
            If CurrentLine= LastLine Then
                reader1.ReadToNextSibling("forecast")
                CurrentLine= reader1.LineNumber
            End If
            While reader1.LineNumber <= LastLine
                For w As Integer = 0 To y
                    reader1.ReadToNextSibling("forecast")
                    CurrentLine= reader1.LineNumber
                Next w
            End While

            LastLine = CurrentLine
            For x As Integer = 1 To 2
                Dim reader As XmlTextReader = New XmlTextReader(dir)

                reader.ReadStartElement("response")
                reader.ReadToNextSibling("hourly_forecast")
                reader.ReadStartElement("hourly_forecast")
                reader.ReadToNextSibling("forecast")
                Do While reader.LineNumber < CurrentLine
                    reader.ReadToNextSibling("forecast")
                Loop
                reader.ReadStartElement("forecast")

                If x = 1 Then
                    reader.ReadToNextSibling("FCTTIME")
                    reader.ReadStartElement("FCTTIME")
                    reader.ReadToNextSibling("hour")
                    values(y, x) = reader.ReadString()
                    d = values(y, x)
                    reader.ReadToNextSibling("year")
                    year = lector.ReadString()
                    reader.ReadToNextSibling("mon_padded")
                    month = reader.ReadString()
                    reader.ReadToNextSibling("mday_padded")
                    day= reader.ReadString()
                    a = year.Chars(2)
                    b = year.Chars(3)
                    c = a + b
                    x = x - 1
                    values(y, x) = day + "-" + month + "-" + c
                    x = x + 1
                End If
                If x = 2 Then
                    reader.ReadToNextSibling("temp")
                    reader.ReadStartElement("temp")
                    reader.ReadToNextSibling("metric")
                    values(y, x) = reader.ReadString()
                End If

            Next x

        Next y

这是我的XML的示例:

 <response>
  <version>0.1</version> 
  <features>
   <feature>hourly10day</feature> 
  </features>
  <hourly_forecast>
   <forecast>
    <FCTTIME>
     <hour>16</hour> 
     <year>2012</year> 
     <mon_padded>10</mon_padded> 
     <mday_padded>05</mday_padded> 
    </FCTTIME>
    <temp>
     <english>102</english> 
     <metric>39</metric> 
    </temp>
   </forecast>
  </hourly_forecast>
 </response>

现在,这有效,但我怎么能将反序列化应用到它?谢谢!

1 个答案:

答案 0 :(得分:1)

序列化是“简单的”,因为您可以将XML转换为几行代码中的对象。但是,根据XML和/或对象的复杂性,可能需要进行一些设置(通过向类定义添加属性),以便序列化成功。

例如,我认为使用XML可以保证一些装饰。这是一组可以代表您的示例XML的类的开头:

<XmlRoot("response")>
Public Class Response
    <XmlElement("version")>
    Public Property Version As String
    <XmlArrayItem("feature")>
    <XmlArray("features")>
    Public Property Features As List(Of String)
    <XmlElement("hourly_forecast")>
    Public Property HourlyForecast As HourlyForecast
End Class

Public Class HourlyForecast
    <XmlElement("forecast")>
    Public Property Forecast As Forecast
End Class

Public Class Forecast
    <XmlElement("FCTTIME")>
    Public Property FctTime As FctTime
End Class

Public Class FctTime
    <XmlElement("hour")>
    Public Property Hour As String
    <XmlElement("year")>
    Public Property Year As String
    <XmlElement("mon_padded")>
    Public Property PaddedMonth As String
    <XmlElement("mday_padded")>
    Public Property PaddedMonthDay As String
End Class

您会注意到许多属性和其中一个类都使用属性进行修饰。这些属性有助于序列化程序协调XML中每个值的放置到对象内的相应属性中。通常,人们会将类和属性命名为与XML中的类相同。这样做,您可以经常离开,而不必使用属性。在这种情况下,因为.NET实践是对类和属性名称使用Pascal大小写,并且因为您的XML使用小写,所以我插入了属性以正确地将每个XML节点与相应的属性/类相关联。如果不这样做,序列化程序将无法正确地将元素映射到对象。

我提到在代码中从XML转移到对象可以在几行中完成。这可能是这样的:

Imports System.Xml.Serialization
Imports System.IO

Module Module1

    Sub Main()
        Dim serializer As New XmlSerializer(GetType(Response))
        Dim reader As New StreamReader("dump.xml")
        Dim instance As Response = serializer.Deserialize(reader)

        reader.Dispose()
    End Sub

End Module

虽然构建代表XML的类的代码确实需要几行,但这是不可避免的。你的方法会有类似的东西 - 当然不是属性。这里节省的是您在一次快速调用中将对象转换为Serialize方法。