转:使用XMLSerializer类持久化数据
XML 的普通要求
XML 序列化是將一個對象的公有屬性(property)和域(field)轉換到一個序列化格式(在這里是 XML)用于存儲或傳輸的過程。反序列化是從 XML 輸出中按照對象的原始狀態重新創建對象的過程。因此,你可以將序列化看作是一種將對象狀態保存到一個流或緩沖區的方法。
序列的兩個常用的地方是數據持久化和數據交換。持久化指在用戶的會話間保存數據的過程。當應用程序關閉時數據被存儲(序列化),當用戶回來時數據被重新裝載(反序列化)。數據交換是將數據提供其它系統的過程。使用序列化和 XML 可以很簡單地實現數據交換。
對象中的數據在編程語句結構中被描述為類(class)、域(field)、屬性(property)、基元類型(primitive type)、數組(array),甚至是以System.Xml.XmlElement或System.Xml.XmlAttribute形式出現的內嵌 XML。
System.Xml.Serialization命名空間的中心類是XmlSerializer。它還包含處理 XML 的各個方面的類以及使用 SOAP 的類,但是XmlSerializer是我們關注的焦點。
XmlSerializer
XmlSerializer類允許你將數據序列化到 XML 文檔并從 XML 文檔反序列化對象。它能夠使你控制對象如何被編碼到 XML。其類構造器接受對象類型作為參數以進行序列化。下面的 C# 代碼展示了如何使用構建器:
XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));
下面是對應的 VB.NET 代碼:
Dim ser As New XmlSerializer(GetType(objectToSerialize))
實際的序列化過程是由XmlSerializer類的Serialize 方法完成的。這個方法有六個簽名,這些簽名允許你在序列化過程中使用TextWriter、Stream 和XmlWriter對象。下面的示例代碼展示了如何使用這個方法。該例將一個對象序列化到本地磁盤驅動器上的一個文件中。下面首先列出的是使用類的代碼,然后是實際的序列化代碼:
using System;
namespace BuilderSerialization {
public class Address {
public Address() {}
public string Address1;
public string Address2;
public string City;
public string State;
public string Zip;
public string Country;
} }
using System;
namespace BuilderSerialization {
public class Author {
public Author() { }
public string FirstName;
public string MiddleName;
public string LastName;
public string Title;
public string Gender;
public Address AddressObject;
} }
namespace BuilderSerialization {
public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
public string ISBN;
public double RetailPrice;
public string Publisher;
}}
using System;
using System.Xml.Serialization;
using System.IO;
namespace BuilderSerialization {
class TestClass {
static void Main(string[] args) {
Book BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriter writer = new StreamWriter("booktest.xml");
BookObject.Title = "Practical LotusScript";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Manning Publications";
BookObject.RetailPrice = 43.95;
BookObject.AuthorObject = new Author();
BookObject.AuthorObject.FirstName = "Tony";
BookObject.AuthorObject.LastName = "Patton";
BookObject.AuthorObject.Gender = "Male";
BookObject.AuthorObject.AddressObject = new Address();
BookObject.AuthorObject.AddressObject.Address1 = "1 Main Street";
BookObject.AuthorObject.AddressObject.City = "Anywhere";
BookObject.AuthorObject.AddressObject.State = "KY";
BookObject.AuthorObject.AddressObject.Zip = "40000";
BookObject.AuthorObject.AddressObject.Country = "USA";
ser.Serialize(writer, BookObject);
writer.Close();
} } }
這段代碼使用了三個對象,這三個對象組合成一個對象,所以序列化過程生成一個 XML 文檔。下面是由示例代碼創建的 XML:
<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Title>Practical LotusScript</Title>
<AuthorObject>
<FirstName>Tony</FirstName>
<LastName>Patton</LastName>
<Gender>Male</Gender>
<AddressObject>
<Address1>1 Main Street</Address1>
<City>Anywhere</City>
State>KY</State>
<Zip>40000</Zip>
<Country>USA</Country>
</AddressObject>
</AuthorObject>
<ISBN>1884777767 </ISBN>
<RetailPrice>43.95</RetailPrice>
<Publisher>Manning Publications</Publisher>
</Book>
注意,序列化過程處理對象數據的嵌套。這個過程以一種有用的格式放置數據,使數據在需要時或者要與其它系統交換時容易裝載(反序列化)。在交換數據時,其它系統(如果還不知道 XML 的格式)需要知道 XML 的格式。這可以通過一個 XML schema 文件提供。.NET Framework 含有一個 schema 生成工具 XSD.exe,這個工具可以用來為通過序列化生成的 XML 生成一個 schema 文件。
下面是上例的 VB.NET 代碼:
Public Class Address
Public Address1 As String
Public Address2 As String
Public City As String
Public State As String
Public Zip As String
Public Country As String
End Class
Public Class Author
Public FirstName As String
Public MiddleName As String
Public LastName As String
Public Title As String
Public Gender As String
Public AddressObject As Address
End Class
Public Class Book
Public AuthorObject As Author
Public Title As String
Public ISBN As String
Public RetailPrice As Double
Public Publisher As String
End Class
Imports System.Xml.Serialization
Imports System.IO
Module Module1
Sub Main()
Dim BookObject As New Book
Dim ser As New XmlSerializer(GetType(Book))
Dim writer As New StreamWriter("booktest.xml")
With BookObject
.Title = "Practical LotusScript"
.ISBN = "1884777767 "
.Publisher = "Manning Publications"
.RetailPrice = 43.95
.AuthorObject = New Author
.AuthorObject.FirstName = "Tony"
.AuthorObject.LastName = "Patton"
.AuthorObject.Gender = "Male"
.AuthorObject.AddressObject = New Address
.AuthorObject.AddressObject.Address1 = "1 Main Street"
.AuthorObject.AddressObject.City = "Anywhere"
.AuthorObject.AddressObject.State = "KY"
.AuthorObject.AddressObject.Zip = "40000"
.AuthorObject.AddressObject.Country = "USA"
End With
ser.Serialize(writer, BookObject)
writer.Close()
End Sub
End Module
提供方向
序列化過程輸出標準的 XML,其中數據成員作為輸出 XML 的元素,但是你可以通過在類代碼中添加屬性來定制 XML 輸出。這樣允許你創建屬性,而非 XML 元素,或者告訴系統簡單地忽略一個元素。下面重寫了 VB.NET book 類,作為一個例子提供給大家:
Public Class Book
Public AuthorObject As Author
Public Title As String
<System.Xml.Serialization.XmlAttribute()> _
Public ISBN As String
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Public RetailPrice As Double
Public Publisher As String
End Class
這段代碼告訴系統在生成 XML 時將 ISBN 看作一個 XML 屬性,并且忽略RetailPrice成員。下面的 XML 反映了這些變化的結果:
<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ISBN="1884777767 ">
<AuthorObject>
<FirstName>Tony</FirstName>
<LastName>Patton</LastName>
<Gender>Male</Gender>
<AddressObject>
<Address1>1 Main Street</Address1>
<City>Anywhere</City>
<State>KY</State>
<Zip>40000</Zip>
<Country>USA</Country>
</AddressObject>
</AuthorObject>
<Title>Practical LotusScript</Title>
<Publisher>Manning Publications</Publisher>
</Book>
用 C# 寫出的同一個例子:
public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
[System.Xml.Serialization.XmlAttribute()]
public string ISBN;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public double RetailPrice;
public string Publisher;
}
這里只提供了可用屬性的一個皮毛。參考 .NET 文檔查看這些標識符的一個完整列表。
反序列化
反序列化數據是一個簡單的過程,可以通過XmlSerializer類的Deserialize方法實現。下面的 VB.NET 代碼片斷將前面例子的輸出進行了反序列化處理。
Dim BookObject As New Book
Dim ser As New XmlSerializer(GetType(Book))
Dim fs As New System.IO.FileStream("booktest.xml", FileMode.Open)
Dim reader As New System.XML.XmlTextReader(fs)
BookObject = CType(ser.Deserialize(reader), Book)
這段代碼將數據放到內存中以供需要時使用。下面是 C# 代碼版本:
XmlSerializer ser = new XmlSerializer(typeof(Book));
System.IO.FileStream fs = new System.IO.FileStream("booktest.xml",
FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs);
Book BookObject = (Book)(ser.Deserialize(reader));
轉載于:https://www.cnblogs.com/xiaotaoliang/archive/2005/10/12/252921.html
總結
以上是生活随笔為你收集整理的转:使用XMLSerializer类持久化数据的全部內容,希望文章能夠幫你解決所遇到的問題。