Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
598 views
in Technique[技术] by (71.8m points)

trying to serialize and deserialize an xml file using VB.net

The xml file should like this after I serialize and then I want to deserialize this in vb.net. I am a begginer in programming. Any help is appreciated.

<?xml version="1.0"?>
<Countries>
  <Country>
    <CID>1</CID>
    <CountryName>India</CountryName>
    <States>
      <State> New Delhi </State>
      <State> Maharashtra </State>
      <State> Rajasthan </State>
    </States>
  </Country>
  <Country>
    <CID>2</CID>
    <CountryName>United States</CountryName>
    <States>
      <State> Washington </State>
      <State> Texas </State>
    </States>
  </Country>
  <Country>
    <CID>3</CID>
    <CountryName>Australia</CountryName>
    <States>
      <State> Queensland </State>
      <State> Victoria </State>
    </States>
  </Country>
</Countries>
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I'd advise you to definitely look into XML serialization. A lot of information can be found on MSDN (but also using any search engine). For example on MSDN: Introducing XML Serialization.

If you have nothing yet, for code. I would keep it very simple to deserialize the given XML structure. You can create a simple class definition for a Country, as shown below:

Public Class Country
    Public Property CID As Integer
    Public Property CountryName As String
    Public Property States As List(Of String)

    Public Sub New()
        States = New List(Of String)()
    End Sub
End Class

Now this doesn't work yet 100%. You have to help the serialization object with the list of states. You can annotate (with attributes) the States, so the serializer knows that each item is named differently (default it would be <string>item</string>). You can use the XmlArrayItem attribute for this.

<Serializable()>
Public Class Country
    Public Property CID As Integer
    Public Property CountryName As String
    <XmlArrayItem("State")>
    Public Property States As List(Of String)

    Public Sub New()
        States = New List(Of String)()
    End Sub
End Class

Finally, for deserialization. I'd deserialize to a List(Of Country), as it clearly is a list. (Assuming the above XML is stored in a file "obj.xml".)

Dim serializer As New XmlSerializer(GetType(List(Of Country)))
Dim deserialized As List(Of Country) = Nothing
Using file = System.IO.File.OpenRead("obj.xml")
    deserialized = DirectCast(serializer.Deserialize(file), List(Of Country))
End Using

Now we still have to help the serializer object, because otherwise it doesn't know how to deserialize the given XML; as it doesn't determine the root node correctly. We can use an overload of the constructor here, in which we can say what the root node is (XmlSerializer Constructor (Type, XmlRootAttribute)).

Final code for deserialization would be:

Dim serializer As New XmlSerializer(GetType(List(Of Country)), New XmlRootAttribute("Countries"))
Dim deserialized As List(Of Country) = Nothing
Using file = System.IO.File.OpenRead("obj.xml")
    deserialized = DirectCast(serializer.Deserialize(file), List(Of Country))
End Using

Code for serialization (writing to file "obj.xml"):

Dim countries As New List(Of Country)()
' Make sure you add the countries to the list

Dim serializer As New XmlSerializer(GetType(List(Of Country)), New XmlRootAttribute("Countries"))
Using file As System.IO.FileStream = System.IO.File.Open("obj.xml", IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
    serializer.Serialize(file, countries)
End Using

All this could have been found quite easily by searching and reading the documentation.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...