深入理解 XML與物件的序列化與反序列化

2022-10-04 08:57:09 字數 3396 閱讀 4672

假設我們在乙個web專案中有這樣兩個類

複製** **如下:

public class member

&nb程式設計客棧sp;

public string name

}public class team

}假設我們需要把team類的乙個例項post到乙個url,

當然,使用form隱藏域提交就可以完成該功能。

如果該team包括30條資料呢?

為了區分每個member,我們得給引數的名字加上字尾。這就要一大串的隱藏域來完成:

複製** **如下:

@model team

還敢想象一下如果team再複雜一些,巢狀再多一些的情況麼?

呃,即使你願意這麼傳資料,對方看到一坨引數名就夠頭疼了。

我們都知道物件是不能在網路中直接傳輸的,不過還有補救的辦法。

xml(extensible markup language)可擴充套件標記語言,本身就被設計用來儲存資料,任何乙個物件都可以用xml來描述。以team類為例:

複製** **如下:

<?xml version="1.0" encoding="utf-8"?>

development

001&nbsnwxybgp; marry

002john

這樣乙個xml文件就表示了team乙個例項。

聰明的看官應該已經想到,xml是可以作為物件資訊的載體在網路中傳輸,因為它是文字形式的。

怎麼進行xml文件與物件的相互轉換呢?

xmlserializer類就是幹這個活的。

命名空間:system.xml.serialization

程式集:system.xml(在 system.xml.dll 中)

現在這裡展示了乙個提供序列化與反序列化方法的encodehelper類。

deserialize方法將xml字串轉換為指定型別的物件;

serialize方法則將物件轉換為xml字串。

複製** **如下:

///

/// 提供xml文件序列化 反序列化

///

public sealed class encodehelper

}catch (exception innerexception)

}throw new applicationexception(string.format("couldn't parse xml: ''; contains bom: ; type: .",

xml, flag, thistype.fullname), innerexception);

}return result;

}///

/// 序列化object物件為xml字串

///

public static string serialize(object objecttoserialize)

}catch (exception innerexception)

return result;}}

要使用這個類需要新增以下引用

using system;

using system.text;

using system.io;

using system.xml;

using system.xml.serialization;

下面我們用乙個控制台程式來演示一下這個類是如何工作的。這裡是程式的main函式。

複製** **如下:

static void main(string args)

;member member2 = new member ;

www.cppcns.com;           members.add(member1);

members.add(member2);

team team = new team ;

var xml =encodehelper.serialize(team);//序列化

console.write(xml);//列印序列化後的xml字串

console.readline();

team newteam = encodehelper.deserialize(xml, typeof(team)) as team;//反序列化時需要顯式的進行型別轉換

console.writeline("team name:"+newteam.name);//顯示反序列化後的newteam物件

foreach (var member in newteam.members)

console.readline();

}在執行完console.write(xml)這行**後,就可以看到列印出來的xml文件了。

複製** **如下:

<?xml version="1.0" encoding="utf-8"?>

development

001marry

002john

與我在文章開頭給出的例子是一模一樣的。

最終反序列化出來的newteam物件列印出來是這樣的結果。

team name:development

member num:001

member name:marry

member num:002

member name:john

回到我們開頭的web通訊的例子,

利用xml序列化與反序列化來進行物件傳遞,我們只需要把需要傳遞的物件序列化為xml字串,使用乙個隱藏域進行form提交就可以搞定咯!

接收方再將接收到的xml字串反序列化成預設的物件即可。前提是雙方必須約定序列化與反序列化的過程一致,且物件相同。

最後我們來看一下怎麼利用一些特性來控制序列化與反序列化操作的過程。我們把開始的類改一下:

複製** **如下:

public class member

public string name

}[xmlroot("our_team")]

public class team

}然後我們再次執行剛才的控制台程式,序列化結果變成了這樣:

複製** **如下:

<?xml version="1.0" encoding="utf-8"?>

&n 001

marry

002john

本來的根節點team變成了our_team,member的子節點num變成了member_num,並且team的name子節點被忽略了。

可見特性xmlroot可以控制根節點的顯示和操作過程,xmlelement則針對子節點。如果某些成員被標記xmlignore,則在序列化與反序列化過程中會被忽略。

這些特性的具體內容可以在msdn檢視,就不多講了。

有了這些知識,在網路中傳遞物件資料應該已經難不倒各位看官了把。^_^

本文標題: 深入理解:xml與物件的序列化與反序列化

本文位址:

序列化與反序列化 深入理解

序列化指的是將乙個記憶體物件轉化成一串位元組資料 儲存在乙個位元組陣列中 可用於儲存到本地檔案或網路傳輸。反序列化就是將位元組資料還原成記憶體物件。如 struct student 將乙個student物件轉換成位元組資料儲存在bytearray 20 中稱為序列化 如 int count 0 ch...

深入理解序列化和反序列化

序列化 就是將記憶體中的物件轉換為位元組序列,方便持久化到磁碟或者網路傳輸。物件序列化過程可以分為兩步 第一 將物件轉換為位元組陣列 第二 將位元組陣列儲存到磁碟 public static byte getbytearray4object object obj throws exception p...

物件,物件集合的簡單Xml序列化與反序列化

物件,物件集合的簡單xml序列化與反序列化 本文描述如何使用clr中的 stringwriter,xmlserializer將物件,物件集合 序列化為xml格式的字串,同時描述如何進行 反序列化.c 版本 c 3.0 開發環境 vs 2008 主要方法 複製複製 複製儲存 usingsystem u...