VB 2010 (35) XML序列化

这篇博客介绍了如何使用VB 2010中的XmlSerializer类进行XML序列化和反序列化操作。通过示例展示了如何将对象序列化成XML文档,以及如何从XML文档反序列化回对象。具体涉及到FilmOrder类的实例化,以及如何将序列化结果输出到控制台和保存到文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        对象的序列化就是将该对象写入一个流中,如文件或套接字。也可以执行其逆过程:从流中读取对象,对对象进行反序列化。
这样可以把对象的数据保存在本地文件中,或者传送到网络上。
    System.Xml.Serialization名称空间包含的类和接口支持把对象序列化到XML,或者把XML反序列化到对象口要把对象序列化到文档或流中,可以使用XmISerializer类。、

XmlSerializer 类

https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.serialization.xmlserializer?view=netframework-4.8

FilmOrder类:

Public Class FilmOrder
    Public Name As String
    Public FilmId As Integer
    Public Quantity As Integer

    Public Sub New()

    End Sub

    Public Sub New(ByVal name As String, _
                   ByVal filmID As Integer, _
                   ByVal quatity As Integer)
        Me.Name = name
        Me.FilmId = filmID
        Me.Quantity = quatity
    End Sub
End Class

控制台应用程序:

Imports System.Xml.Serialization
Module Module1

    Sub Main()

    ‘创建一个XmlSerializer实例,并在其构造函数中指定需要序列化的对象及其类型:
        Dim serialize As XmlSerializer = New XmlSerializer(GetType(FilmOrder))
   ’创建一个该类型的实例,并作为一个参数传递到XmISerializer的构造函数中。在比较复杂的应用程序中,可能需要使用客户端、数据库或其他数据源提供的数据创建这个实例:
        Dim MyFilmOrder As FilmOrder = New FilmOrder("Greese", 101, 10)
    ‘调用XmISerializer实例的Serialize方法,指定要序列化的对象写入哪个流(这里是Console;Out,显示在控制台窗口中.)以及要序列化的对象:
        serialize.Serialize(Console.Out, MyFilmOrder)

        Console.WriteLine()

        Console.Read()
    End Sub

End Module
运行这个模块,将生成下面的内容:
<?xml  version=”l . 0 "   encoding="IBM437" ?>
<FilmOrdar  xmlns : xsi = "http : //WWW.w3 .org/2001/XMLSchema-instance"
           xmlns : xsd="http : //www.w3 . Org/20 0l/XMLSchema">
  <Name>Grease</Name>
  <Filmld>101</Filmld>
  <Quantity>10</Quantity>
</FilmOrder>

这个输出结果说明了Serialize方法在序列化一个对象时所采取的默认方式:

  • 每个被序列化的对象都表示为一个与类同名的元素,在本例中是FilmOrder。
  • 序列化对象的每个数据成员都包含在以该数据成员命名的元素中。在本例中分别为Name、Filmld年口Quantity。

其他生成的内容包括:

  • XML的具体版本——在本例中是1.00
  • 使用的编码方式一在本例中是IBM4370
  • 用于描述序列化对象的架构——在本例中XML架构规范定义了两个模式http://www.w3.org/2001fXMLSchema- instance和http://www.w3.org/2001/XMLSchema.

            Serialize方法的第一个参数被重写,使之能够把XML序列化到文件(文件名用String类型指定)、Stream、TextWriter或者XmIWriter中。当序列化到Stream、TextWriter或XmIWriter时,Serialize方法的第3个参数是有效的。这个参数的类型是XmISerializerNamespaces,用于指定名称空间的列表,以限定生成的XML文档中使用的名称。      

Serialize(Object, XmlSerializationWriter)

使用指定的 Object 序列化指定的 XmlSerializationWriter 并将 XML 文档写入文件。

Serialize(Stream, Object)

使用指定的 Object 序列化指定的 Stream 并将 XML 文档写入文件。

Serialize(Stream, Object, XmlSerializerNamespaces)

使用引用指定命名空间的指定 Object 序列化指定的 Stream 并将 XML 文档写入文件。

Serialize(TextWriter, Object)

使用指定的 Object 序列化指定的 TextWriter 并将 XML 文档写入文件。

Serialize(TextWriter, Object, XmlSerializerNamespaces)

使用指定的 Object 和指定命名空间序列化指定的 TextWriter 并将 XML 文档写入文件。

Serialize(XmlWriter, Object)

使用指定的 Object 序列化指定的 XmlWriter 并将 XML 文档写入文件。

Serialize(XmlWriter, Object, XmlSerializerNamespaces)

使用指定的 Object 和指定命名空间序列化指定的 XmlWriter 并将 XML 文档写入文件。

Serialize(XmlWriter, Object, XmlSerializerNamespaces, String)

使用指定的 XmlWriter 和指定命名空间及编码样式序列化指定对象并将 XML 文档写入文件。

Serialize(XmlWriter, Object, XmlSerializerNamespaces, String, String)

使用指定的 Object、XML 命名空间和编码序列化指定的 XmlWriter 并将 XML 文档写入文件。

    Deserialize方法用于重新构造对象。该方法的重载版本可以把XML反序列化为Stream、TextReader或XmIReader。各种Deserialize方法的输出是—个通用的Object,所以需要把所得的对象转换为正确的数据类型。

Deserialize(Stream)

反序列化指定 Stream 包含的 XML 文档。

Deserialize(TextReader)

反序列化指定 TextReader 包含的 XML 文档。

Deserialize(XmlReader)

反序列化指定 XmlReader 包含的 XML 文档。

Deserialize(XmlReader, String)

反序列化指定 XmlReader 和编码样式包含的 XML 文档。

Deserialize(XmlReader, String, XmlDeserializationEvents)

使用指定的 XmlReader 包含的数据反序列化该对象。

Deserialize(XmlReader, XmlDeserializationEvents)

反序列化一个由指定的 XmlReader 包含的 XML 文档,并允许重写反序列化过程中发生的事件。

Deserialize(XmlSerializationReader)

反序列化指定 XmlSerializationReader 包含的 XML 文档。

反序列化:

FilmOrderList类:

Public Class FilmOrderList

    ’FilmOrder对象数组。
    Public multiFilmOrders() As FilmOrder
    Public Sub New()
    End Sub

    Public Sub New(ByVal multiFilmOrder() As FilmOrder)
        Me.multiFilmOrders = multiFilmOrders
    End Sub
End Class

   创建一个XMI格式的样例订单,并把它保存在XML文件Filmorama.xml中:

<?xml version="1.0" encoding="utf-8" ?>
<FilmOrderList xmlns:xsi="http : //www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema ">
  <FilmOrder>
      <Name>Grease</Name>
      <FilmId>1O1</FilmId>
      <Quantity>1O</Quantity>
  </FilmOrder>
  <FilmOrder>
      <Name>Lawrence of Arabia</Name>
      <FilmId>102</FilmId>
      <Quantity>lO</Quantity>
  </FilmOrder>
  <FilmOrder>
      <Name>Star wars</Name>
      <FilmId>103</FilmId>
      <Quantity>1O</Quantity>
   </FilmOrder>
</FilmOrderList>


       Sub Main()中的代码从文件Filmorama xml中反序列化—个FilmOrderList类型的对象。使用这个文反序列化对象是通过XmlSerializer的Deserialize方完成的:

Imports System.Xml
Imports System.Xml.Serialization
Imports System.IO
Module Module1

    Sub Main()
        '序列化
        'Dim serialize As XmlSerializer = New XmlSerializer(GetType(FilmOrder))
        'Dim MyFilmOrder As FilmOrder = New FilmOrder("Greese", 101, 10)
        'serialize.Serialize(Console.Out, MyFilmOrder)
        'Console.WriteLine()


        '反序列化
        Dim dehydrated As FileStream = New FileStream("K:\VB练习\Visual Basic 2010 高级教程\014XML序列化\Filmorama.xml", FileMode.Open)

        'Dim mytextreader As XmlTextReader = New XmlTextReader("...\Filmorama.xml")

        Dim serialize As XmlSerializer = New XmlSerializer(GetType(FilmOrderList))

        'Dim mfilmOrder() As FilmOrder
        Dim myFilmOrderList As FilmOrderList = New FilmOrderList

        myFilmOrderList = serialize.Deserialize(dehydrated)

        '测试得到的结果
        serialize.Serialize(Console.Out, myFilmOrderList)

        Dim SingleFilmOrder As FilmOrder
        If IsNothing(myFilmOrderList.multiFilmOrders) Then
            MsgBox("空")
        Else
            For Each SingleFilmOrder In myFilmOrderList.multiFilmOrders
                Console.Out.WriteLine("{0},{1},{2}", _
                            SingleFilmOrder.Name, _
                            SingleFilmOrder.FilmId, _
                            SingleFilmOrder.Quantity)

            Next
        End If


        Console.Read()

    End Sub

End Module
其内容输出如下:
Grease, 101, 10
Lawrence of Arabia, 102, 10
Star Wars, 103, 10
--------------------------------------------

编译出错,学习ing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值