亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

利用XMLSerializer將對象串行化到XML

2024-09-05 20:53:35
字體:
來源:轉載
供稿:網友

    微軟已經意識到串行化數據的重要性,因此在.NET框架中包含了命名空間System.Runtime.Serialization和System.Xml.Serialization以提供串行化功能,為用戶自己編寫串行化方法提供了一個框架。System.Xml.Serialization命名空間提供了將一個對象串行化為XML格式的基本方法。下面我們來看看如何使用這種方法。

XML的魅力

    串行化XML是指為了方便存儲或傳輸,把一個對象的公共的域和屬性保存為一種串行格式(這里是XML格式)的過程。非串行化則是使用串行的狀態信息將對象從串行XML狀態還原成原始狀態的過程。因此,可以把串行化看作是將對象的狀態保存到流或緩沖區中的一種方法。

串行化的目的是數據存儲和數據轉換。數據存儲指的是在用戶會話時保存數據。當應用程序關閉時,數據被保存(串行化),而當用戶回來時,數據又被重新加載(非串行化)。數據轉換指將數據變換成能被另一個系統識別的格式。使用串行化和XML,可以很方便的進行數據轉換。

    對象中的數據可以是類、方法、屬性、私有類型、數組,在System.Xml.XmlElement或System.Xml.XmlAttribute對象中,它甚至可以是內嵌的XML。

    System.Xml.Serialization命名空間中的關鍵類是XmlSerializer。當然在該命名空間中還包括有關XML其他方面以及SOAP相關的其他類,不過我們的重點是XmlSerializer類。

XmlSerializer
    XmlSerializer類提供了把對象串行化為XML文件及把XML文檔非串行化為對象的方法。它還能讓用戶指定對象如何轉化為XML??梢园褜⒈淮谢膶ο蟮念愋妥鳛轭悩嬙旌瘮档膮怠O旅娴腃# 代碼說明了構造函數的用法。

    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 schema文件。.NET框架中的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屬性而非元素,也可以簡單的被忽略掉。下面的例子是一段經過修改后的book類VB.NET代碼。

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程序片斷完成上文中XML文檔的非串行化:

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.FileStreamfs = new System.IO.FileStream("booktest.xml",
FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs);
Book BookObject = (Book)(ser.Deserialize(reader));


---------------------------------------------------
作者簡介:Tony Patton是一名專業應用程序開發人員,知識面廣泛,獲得了Java、 VB、 Lotus和XML認證。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线视频免费| 欧美电影免费观看高清| 国产精品久久久久久久app| 国产精品免费一区二区三区都可以| 黑人巨大精品欧美一区二区一视频| 亚洲精品国偷自产在线99热| 国产欧美一区二区三区视频| 色综合伊人色综合网| 91在线直播亚洲| 亚洲三级免费看| 国产手机视频精品| 国产啪精品视频网站| 欧美成人精品一区二区| 久久中文字幕一区| 亚洲欧美日韩一区二区在线| 欧美午夜片在线免费观看| 国产精品一区二区女厕厕| 亚洲欧美三级在线| 国产精品6699| 欧美日韩人人澡狠狠躁视频| 国产成人精品免高潮费视频| 亚洲精品中文字| 影音先锋欧美精品| 久久久久久久久久久网站| 日韩精品在线观看网站| 国产亚洲精品91在线| 91精品久久久久久久久久久久久| 亚洲国产精品美女| 欧美日韩一区二区免费视频| 国产精品av免费在线观看| 国产婷婷成人久久av免费高清| 亚洲精品天天看| 最近2019中文免费高清视频观看www99| 高跟丝袜一区二区三区| 欧美激情在线一区| 成人免费淫片视频软件| 亚洲一区二区三| 青草青草久热精品视频在线网站| 中文一区二区视频| 精品一区二区电影| 日韩精品视频在线免费观看| 亚洲第一福利视频| 久久久av亚洲男天堂| 久久久久久亚洲精品不卡| 久久久天堂国产精品女人| 欧美激情videoshd| 国产精品综合网站| 欧美性资源免费| 日韩成人小视频| 国产精品亚发布| 日韩美女在线观看| 欧美久久精品午夜青青大伊人| 国产精品人成电影| 欧美大片大片在线播放| 91精品国产自产91精品| 国产欧美va欧美va香蕉在| 中文字幕精品久久久久| 欧美色欧美亚洲高清在线视频| 久久久久久久久久久久久久久久久久av| 欧美日本高清视频| 欧美怡春院一区二区三区| 成人有码在线播放| 久久久久久久久久久亚洲| 亚洲最大激情中文字幕| 久久精品视频导航| 97国产在线观看| 国产精品精品视频| 成人激情视频在线观看| 亚洲精品第一国产综合精品| 亚洲欧洲视频在线| 日韩欧美大尺度| 亚洲一区亚洲二区| 精品国产乱码久久久久久婷婷| 国产精品视频一区二区高潮| 国产成人+综合亚洲+天堂| 在线成人激情视频| 亚洲精品www久久久久久广东| 欧美日韩成人黄色| 国产精品福利久久久| 亚洲欧美日韩国产中文专区| 亚洲va欧美va在线观看| 日本国产一区二区三区| 91欧美精品午夜性色福利在线| 91精品久久久久久久久中文字幕| 亚洲精品黄网在线观看| 亚洲淫片在线视频| 性欧美亚洲xxxx乳在线观看| 日韩欧美在线国产| 日韩精品视频在线观看免费| 日韩中文字幕第一页| 91亚洲精品一区| 欧美电影在线观看| 热99在线视频| 久久精品国产电影| 国产精品小说在线| 日韩a**站在线观看| 成人综合网网址| 亚洲国产中文字幕久久网| 亚洲女人天堂av| 欧美重口另类videos人妖| 亚洲男女自偷自拍图片另类| 黑人欧美xxxx| 国产精品美女久久久久久免费| 国产精品一区二区久久久久| 国产亚洲精品美女| 91在线精品视频| 久久久久免费精品国产| 国产精品久久久久免费a∨| 日韩中文字幕在线看| 97视频在线免费观看| 亚洲精品国精品久久99热一| 在线日韩日本国产亚洲| 九九热99久久久国产盗摄| 性色av一区二区咪爱| 日韩少妇与小伙激情| 色婷婷成人综合| 九色精品美女在线| 欧美大尺度电影在线观看| 91美女片黄在线观看游戏| 欧美一区二区.| 国产欧美精品一区二区| 亚洲精品99久久久久中文字幕| 国产日韩在线免费| 国产欧美va欧美va香蕉在线| 欧美精品在线网站| 日韩国产一区三区| 国内精品美女av在线播放| 欧美噜噜久久久xxx| 日韩欧美成人免费视频| 国产精品视频最多的网站| 97在线视频免费| 国产精品成人久久久久| 中文国产亚洲喷潮| 伊人久久久久久久久久久久久| 国产美女精品视频免费观看| 亚洲影院色无极综合| 亚洲成人免费在线视频| 91精品国产九九九久久久亚洲| 久久久成人av| 亚洲码在线观看| 亚洲网址你懂得| 久久av在线播放| 91高清视频在线免费观看| 97精品欧美一区二区三区| 久久综合久久88| 日韩国产在线播放| 97免费中文视频在线观看| 日韩在线免费观看视频| 欧美制服第一页| 日本精品在线视频| 欧美一级黑人aaaaaaa做受| 成人性生交xxxxx网站| 成人在线观看视频网站| 国产精品久久久久高潮| 51精品国产黑色丝袜高跟鞋| 日韩久久午夜影院| 欧美激情一区二区三级高清视频| 日韩最新在线视频| 久久理论片午夜琪琪电影网| 欧美精品在线播放| 亚洲国产高潮在线观看| 日韩欧美国产黄色| 狠狠做深爱婷婷久久综合一区| 色偷偷av一区二区三区|