XML序列化和反序列化

2022-01-11 19:13:45 字數 3871 閱讀 9750

不過在上篇中忘了把json序列化和反序列化的另外一種方式寫上去了,這裡做個簡單的補充:

json篇:

json序列化和反序列化擴充套件方法實現類:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.web.script.serialization;

namespace

helpclass.typehelp

public

static t jsondeserialize(this

string

jsonstring)

}}

ok!接下來就是xml

1、  靜態方法+泛型實現

xml工具類:

using

system;

using

system.collections.generic;

using

system.io;

using

system.linq;

using

system.text;

using

system.xml;

using

system.xml.serialization;

namespace

helpclass.typehelp

}//////

將乙個物件序列化為xml字串

/// ///

要序列化的物件

///編碼方式

///是否需要命名空間true:需要 false:不需要

///序列化產生的xml字串

public

static

string xmlserialize(object o, encoding encoding, bool

isnamespaces)}}

//////

從xml字串中反序列化物件

/// ///

結果物件型別

///包含物件的xml字串

///編碼方式

///反序列化得到的物件

public

static t xmldeserialize(string

s, encoding encoding)}}

//////

將乙個物件按xml序列化的方式寫入到乙個檔案

/// ///

要序列化的物件

///儲存檔案路徑

///編碼方式

///是否需要命名空間true:需要 false:不需要

public

static

void xmlserializetofile(object o, string path, encoding encoding, bool

isnamespaces)

}//////

讀入乙個檔案,並按xml的方式反序列化物件。

/// ///

結果物件型別

///檔案路徑

///編碼方式

///反序列化得到的物件

public

static t xmldeserializefromfile(string

path, encoding encoding)

}}

在乙個專案中,如果面臨大量的xml(如呼叫大量返回xml的外部介面),這時就需要根據xml結構來逆向推導c#型別,然後才能使用序列化和反序列化的方法。

當需要根據xml結構逆向推導型別,我們需要了解一下型別定義與xml結構的對映關係。

對映關係只需要記住幾個標籤:

(1)       [xmlelement]

類中的屬性或者欄位在不標記下預設都會生成xmlelement(不加任何attribute的情況下)該標籤把類中的屬性或者字段序列化為xml中的節點

public class ddd

[xmlelement]

public string d1

public string d2

ddd cd=new ddd12

(2)       [xmlattribute]

類中的屬性或者欄位在標記為[xmlattribute]的情況下會生成為xml中以以該類名為節點的屬性

public class ddd

[xmlattribute]

public string d1

[xmlelement]

public string d2

ddd cd=new ddd

2(3)       [innertext]

如果希望型別中的屬性或者字段生成innertext,需要在型別的成員上用[xmltext]

public class ddd

[xmlattribute]

public string d1

[innertext]

public string d2

ddd cd=new ddd

2(4)       重新命名

xmlattribute,xmlelement允許接受乙個別名用來控制生成節點的名稱,型別的重新命名用xmltype來實現

[xmltype(「ccc」)]

public class ddd

[xmlattribute(「c1」)]

public string d1

[xmlelement(「c2」)]

public string d2

ddd cd=new ddd

2(5)       序列化去掉xml命名空間及宣告頭(工具類中**以有相關說明了)

注意:(1)       當需要考慮使用xml時,先不要想著xml結構,先應該定義好資料型別。

(2)       列表節點不要使用[xmlelement],它會讓所有子節點【公升級】,顯得結構混亂。

(3)       如果希望序列化的xml長度小一點,可以採用[xmlattribute],或者指定乙個更短小的別名(序列化為json進行傳輸也是一種選擇)

(4)       不要在乙個列表中輸出不同的資料型別,這樣的xml結構的可讀性不好。

(5)       盡量使用utf-8編碼,不要使用gb2312編碼。

(6)       列表節點不要使用[xmlelement],它會讓所有子節點【公升級】,顯得結構混亂。

2、  擴充套件方法+泛型實現

using

system;

using

system.collections.generic;

using

system.io;

using

system.linq;

using

system.text;

using

system.xml;

using

system.xml.serialization;

namespace

helpclass.typehelp

return

encoding.utf8.getstring(w.toarray());

}//////

xml反序列化

/// ///

//////

public

static t xmldeserialize(this

string

xmlstring)}}

}}

看完了上面的這些或許你已經對xml的序列化和反序列化有了一定的了解,今天就寫到這裡,下次總結一下別的。

Xml序列化和反序列化

1.xmlserializer 類 該類用一種高度鬆散耦合的方式提供序列化服務。你的類不需要繼承特別的基類,而且它們也不需要實現特別的介面。相反,你只需在你的類或者這些類的公共域以及讀 寫屬性裡加上自定義的特性。xmlserializer 通過反射機制讀取這些特性並用它們將你的類和類成員對映到 xm...

XML序列化和反序列化

閱讀目錄 回到頂部 由於.net framework針對xml提供了很多api,這些api根據不同的使用場景實現了不同層次的封裝,比如,我們可以直接使用xmltextreader xmldocument xpath來取數xml中的資料,也可以使用linq to xml或者反序列化的方法從xml中讀取...

XML序列化和反序列化

在談xml序列化之前,我們先來說說序列化。為什麼要做序列化和反序列化?net程式執行時,物件都駐留在記憶體中 記憶體中的物件如果需要傳遞給其他系統使用 或者在關機時需要儲存下來以便下次再次啟動程式使用就需要序列化和反序列化。序列化名詞解釋 序列化是將物件狀態轉換為可保持或傳輸的格式的過程。與序列化相...