XmlSerializer 對象的Xml序列化和反序列化,XMLROOT別名設置

這篇隨筆對應的.Net命名空間是System.Xml.Serialization;文中的示例代碼需要引用這個命名空間。

為什么要做序列化和反序列化?
.Net程序執行時,對象都駐留在內存中;內存中的對象如果需要傳遞給其他系統使用;或者在關機時需要保存下來以便下次再次啟動程序使用就需要序列化和反序列化。
范圍:本文只介紹xml序列化,其實序列化可以是二進制的序列化,也可以是其他格式的序列化。
看一段最簡單的Xml序列化代碼
1
2
3
4
5
6
7
8
9
10
11
12
class?Program
{
????static?void?Main(string[] args)
????{
????????int?i = 10;
????????//聲明Xml序列化對象實例serializer
????????XmlSerializer serializer = new?XmlSerializer(typeof(int));
????????//執行序列化并將序列化結果輸出到控制臺
????????serializer.Serialize(Console.Out, i);
????????Console.Read();
????}
}

上面代碼對int i進行了序列化,并將序列化的結果輸出到了控制臺,輸出結果如下

<?xml version="1.0" encoding="gb2312"?>
<int>10</int>

可以將上述序列化的xml進行反序列化,如下代碼

static void Main(string[] args)
{using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
<int>10</int>")){//聲明序列化對象實例serializer XmlSerializer serializer = new XmlSerializer(typeof(int));//反序列化,并將反序列化結果值賦給變量iint i = (int)serializer.Deserialize(rdr);//輸出反序列化結果Console.WriteLine("i = " + i);Console.Read();}
}

以上代碼用最簡單的方式說明了xml序列化和反序列化的過程,.Net系統類庫為我們做了大量的工作,序列化和反序列化都非常簡單。但是在現實中業務需求往往比較復雜,不可能只簡單的序列化一個int變量,顯示中我們需要對復雜類型進行可控制的序列化。

自定義對象的Xml序列化:

System.Xml.Serialization命名空間中有一系列的特性類,用來控制復雜類型序列化的控制。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。

看一個小例子,有一個自定義類Cat,Cat類有三個屬性分別為Color,Saying,Speed。

namespace UseXmlSerialization
{class Program{static void Main(string[] args){//聲明一個貓咪對象var c = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };//序列化這個對象XmlSerializer serializer = new XmlSerializer(typeof(Cat));//將對象序列化輸出到控制臺serializer.Serialize(Console.Out, c);Console.Read();}}[XmlRoot("cat")]public class Cat{//定義Color屬性的序列化為cat節點的屬性[XmlAttribute("color")]public string Color { get; set; }//要求不序列化Speed屬性[XmlIgnore]public int Speed { get; set; }//設置Saying屬性序列化為Xml子元素[XmlElement("saying")]public string Saying { get; set; }}
}

可以使用XmlElement指定屬性序列化為子節點(默認情況會序列化為子節點);或者使用XmlAttribute特性制定屬性序列化為Xml節點的屬性;還可以通過XmlIgnore特性修飾要求序列化程序不序列化修飾屬性。

?

對象數組的Xml序列化:

數組的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定數組元素的Xml節點名,XmlArrayItemAttribute指定數組元素的Xml節點名。

如下代碼示例:

/*玉開技術博客 http://www.cnblogs.com/yukaizhao */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;namespace UseXmlSerialization
{class Program{static void Main(string[] args){//聲明一個貓咪對象var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };//序列化這個對象XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));//將對象序列化輸出到控制臺serializer.Serialize(Console.Out, cc);Console.Read();}}[XmlRoot("cats")]public class CatCollection{[XmlArray("items"),XmlArrayItem("item")]public Cat[] Cats { get; set; }}[XmlRoot("cat")]public class Cat{//定義Color屬性的序列化為cat節點的屬性[XmlAttribute("color")]public string Color { get; set; }//要求不序列化Speed屬性[XmlIgnore]public int Speed { get; set; }//設置Saying屬性序列化為Xml子元素[XmlElement("saying")]public string Saying { get; set; }}
}

以上代碼將輸出:

<?xml version="1.0" encoding="gb2312"?>
<cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww
w.w3.org/2001/XMLSchema"><items><item color="White"><saying>White or black,  so long as the cat can catch mice,  it is a good
cat</saying></item><item color="Black"><saying>White or black,  so long as the cat can catch mice,  it is a good
cat</saying></item></items>
</cats>

XmlSerializer內存泄漏問題:

多謝chenlulouis,仔細看了下msdn,確實存在泄漏的情況,msdn說明如下:

動態生成的程序集?

為了提高性能,XML 序列化基礎結構將動態生成程序集,以序列化和反序列化指定類型。此基礎結構將查找并重復使用這些程序集。此行為僅在使用以下構造函數時發生:?

XmlSerializer(Type)?
XmlSerializer.XmlSerializer(Type, String)?

如果使用任何其他構造函數,則會生成同一程序集的多個版本,且絕不會被卸載,這將導致內存泄漏和性能降低。最簡單的解決方案是使用先前提到的兩個構造函數的其中一個。否則,必須在 Hashtable 中緩存程序集,如以下示例中所示。

也就是說我們在使用XmlSerializer序列化,初始化XmlSerializer對象時最好使用下面兩個構造函數否則會引起內存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

C#處理Xml的相關隨筆:

轉載于:https://www.cnblogs.com/goody9807/p/3934892.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376707.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376707.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++智能指針使用指南 part2:智能指針本身的方法以及使用建議

目錄往期文章智能指針本身的方法對于unique_ptr對于shared_ptr對于weak_ptr使用建議1、使用工廠函數而非new構造對象2、在類內部調用其他類的方法3、在某類內部將當前對象指針共享給其他對象4、 智能指針只能管理堆對象&#xff0c;不能管理棧上對象5、不能將this指針直接托管給…

“/”應用程序中的服務器錯誤。

運行時錯誤 說明: 服務器上出現應用程序錯誤。此應用程序的當前自定義錯誤設置禁止遠程查看應用程序錯誤的詳細信息(出于安全原因)。但可以通過在本地服務器計算機上運行的瀏覽器查看。 詳細信息: 若要使他人能夠在遠程計算機上查看此特定錯誤消息的詳細信息&#xff0c;請在位…

JAVA_Collection容器

因為項目的需要&#xff0c;今天抽時間把JAVA中的容器復習了一下&#xff0c;為了以后的不時之需&#xff0c;現在把它記下來。 容器有其名&#xff0c;知其意&#xff0c;用來盛放數據的集合&#xff0c;JAVA中為我們提供了三種容器類&#xff1a;set、list、map&#xff0c;三…

對于enable_shared_from_this、shared_from_this使用筆記

文章為轉載匯總 參考&#xff1a;C11標準庫的一個工具類enable_shared_from_this的作用及原理分析 從這篇文章中可以知道&#xff1a; 當一個類public繼承enable_shared_from_this時&#xff0c;會獲得一個共有方法shared_from_this&#xff1a; class T : public enable_shar…

db file sequential read 事件的優化(一)

db file sequential read 事件的優化&#xff08;一&#xff09; db file sequential read等待事件有3個參數&#xff1a;file&#xff03;&#xff0c;first block&#xff03;&#xff0c;和block數量。在10g中&#xff0c;這等待事件受到用戶I/O等待級別的影響。當處理db fi…

2014-08-26 遇到的小問題

不能快速的保存bug的確是很不爽的事情 &#xff0c;不僅客戶著急 領導也著急 &#xff0c;自己也著急。。。。。。。。哈哈 原來好好的一個平臺 簡單的一個插入記錄 突然就報錯了 錯誤為 could not insert #9521 原來項目是用 NHibernate 做的插入 拋出的異常 真是無法定位到底…

Fatal error: Please read “Security“ section of the manual to find out how to run mysqld as root

.通過在命令后面加上–userroot 進行強制使用root賬號啟動。 cd /etc/init.d mysqld --userroot 參考&#xff1a; https://blog.csdn.net/huo_wa/article/details/117550307?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECT…

取消cp別名'cp -i'(unalias)

在rhel4updae8系統是使用cp命令覆蓋文件總是提示要輸入yes或no&#xff0c;即使加上-f參數也無法強行覆蓋。[2] 方法一&#xff1a; 輸入alias命令&#xff0c;看到系統內部使用的是cp的別名。 #alias alias cpcp -i 輸入unalias cp命令&#xff0c;解除別名。 unalias cp #&…

增加swap分區

在確定了服務器所需要使用的內存后&#xff0c;需要增加1024M的swap空間 具體操作&#xff1a; 1、dd if/dev/zero of/tmp/swap bs1M count1024M #創建1024M的文件塊 2、mkswap /tmp/swap #創建swap文件 3、swapon /tmp/swap #激活swap文件 4、swapon -s #查看swap 5、修改…

python 實現 topk算法

這里的版本是針對的一個class的某一個成員變量進行的&#xff1a; 關于如何定義對象的比較方法&#xff0c;請參考往期文章&#xff1a;python定義對象的比較方法 class province_room_quality_data:def __init__(self, room, quality):self.room roomself.quality qualityd…

2013年,未知的旅程

去年就開始策劃要辭職到外面去闖一闖&#xff0c;今年年初在上一家公司毅然辭職了&#xff0c;理由是自己需要出去鍛煉鍛煉。 帶著一個月的工資&#xff0c;和一點積蓄&#xff0c;還有一個女朋友來到了這個我以前都沒有來過的城市-深圳。 聽好多人都說過深圳是個好地方&#x…

SQL基礎

經過這幾天我才發現原來我最弱的是數據庫&#xff0c;好了現在就來補補吧 SQL(Struct Query Language) 結構化查詢語言&#xff0c;屬于第四代語言&#xff08;接近于自然語言&#xff09;符合主謂賓定狀補 DDL (Data Define L)數據定義語言,創建一個數據庫&#xff0c;創建一個…

主成分分析資料

推薦一份介紹主成分分析的資料&#xff1a;http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf&#xff0c;寫的很好&#xff01; 在R語言中使用PCA&#xff1a;http://www.cnblogs.com/bigshuai/archive/2012/06/18/2553808.html 轉載于:https://…

關于mysql的binlog寫滿磁盤而導致mysql無法連接的問題。

問題描述與追蹤 首先是mysql連不上&#xff1a; [rootVM-90-225-centos ~]# mysql -uroot -p Enter password: ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock (111)然后查看mysql的狀態&#xff1a; [rootVM-90-225-c…

.NET系統架構改造的經驗和教訓

轉自&#xff1a; http://robbinfan.com/blog/43/rid-off-dotnet-experience 在互聯網行業&#xff0c;基于Unix/Linux的網站系統架構毫無疑問是當今主流的架構解決方案&#xff0c;這不僅僅是因為Linux本身足夠的開放性&#xff0c;更因為圍繞傳統Unix/Linux社區有大量的成熟開…

yum error :No module named yum

Yum&#xff08;全稱為 Yellow dog Updater, Modified&#xff09;是一個在Fedora和RedHat以及SUSE、CentOS中的Shell前端軟件包管理器。基於RPM包管理&#xff0c;能夠從指定的服務器自動下載RPM包并且安裝&#xff0c;可以自動處理依賴性關系&#xff0c;并且一次安裝所有依賴…

403報錯解決方案

403報錯解決方案 服務器使用yum install httpd時出現403報錯&#xff0c;參考了幾個文章&#xff1a; 首先根據這篇文章&#xff1a; devcloud上yum install 安裝軟件報錯403 打開 /root/.bashrc 文件&#xff0c;然后在最末尾可以看到 no_proxy&#xff1a; export no_pr…

控制器中獲取Field值

在ASP.NET MVC程序中&#xff0c;我們需要POST Data到制器中&#xff0c;是有很多方法。但是我們想在控制器中&#xff0c;獲取Feild值呢&#xff1f;怎樣獲取&#xff1f;你可以留意到有一個類FormCollection。它能幫助到我們解決這個問題。 舉個簡單的例子。在ASP.NET MVC應用…