对象的序列化就是将该对象写入一个流中,如文件或套接字。也可以执行其逆过程:从流中读取对象,对对象进行反序列化。
这样可以把对象的数据保存在本地文件中,或者传送到网络上。
System.Xml.Serialization名称空间包含的类和接口支持把对象序列化到XML,或者把XML反序列化到对象口要把对象序列化到文档或流中,可以使用XmISerializer类。、
XmlSerializer 类
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) | |
Serialize(Stream, Object, XmlSerializerNamespaces) | |
Serialize(TextWriter, Object) | 使用指定的 Object 序列化指定的 TextWriter 并将 XML 文档写入文件。 |
Serialize(TextWriter, Object, XmlSerializerNamespaces) | 使用指定的 Object 和指定命名空间序列化指定的 TextWriter 并将 XML 文档写入文件。 |
Serialize(XmlWriter, Object) | |
Serialize(XmlWriter, Object, XmlSerializerNamespaces) | |
Serialize(XmlWriter, Object, XmlSerializerNamespaces, String) | 使用指定的 XmlWriter 和指定命名空间及编码样式序列化指定对象并将 XML 文档写入文件。 |
Serialize(XmlWriter, Object, XmlSerializerNamespaces, String, String) |
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