XML序列化與反序列化

C#對于XML的序列化與反序列化提供了很好的支持,我們只需要引用System.Xml的命名空間即可,無需使用第三方庫,下面簡單實現了一個XML的序列化與反序列化的幫助類。

1.序列化:

先聲明一個變量var settings = new XmlWriterSettings,分別設置兩個屬性Encoding = new UTF8Encoding(false)和?Indent = true。第一個從字面意思即可知道是設置要使用的文本編碼的類型,但為什么這里沒有使用默認的Encoding.UTF8呢,這是因為如果用Encoding.UTF8將在輸出文本的最前面添加4個字節的非xml內容。Indent屬性表示是否縮進元素。第二點需要注意的是XmlSerializerNamespaces這里,var ns聲明一個變量并添加空元素的意義在于強制指定命名空間,覆蓋默認的命名空間

2.反序列化:

反序列化相對來說就比較簡單了,IsNullOrEmpty的意義在于當傳入的字符串是null或者空時函數就返回true,否則返回false。可以參看源碼的實現

public static bool IsNullOrEmpty(string value){ return value == null || value.Length == 0; }?

其它的就參看源碼吧。

 1 using System;
 2 using System.IO;
 3 using System.Text;
 4 using System.Xml;
 5 using System.Xml.Serialization;
 6 
 7 namespace XmlHelper
 8 {
 9     public static class XmlSerializeHelper
10     {
11         /// <summary>
12         /// XML序列化
13         /// </summary>
14         /// <typeparam name="T"></typeparam>
15         /// <param name="obj"></param>
16         /// <returns></returns>
17         public static string XmlSerializer<T>(T obj)
18         {          
19             var settings = new XmlWriterSettings
20             {
21                 Encoding = new UTF8Encoding(false),
22                 Indent = true
23             };
24 
25             using (var ms = new MemoryStream())
26             {                           
27                 using (var xw = XmlWriter.Create(ms, settings))
28                 {
29                     var ns = new XmlSerializerNamespaces();
30                     ns.Add("", "");
31                     var serializer = new XmlSerializer(obj.GetType());
32                     serializer.Serialize(xw, obj, ns);
33                     return Encoding.UTF8.GetString(ms.ToArray());
34                 }
35             }
36         }
37 
38         /// <summary>
39         /// XML反序列化
40         /// </summary>
41         /// <typeparam name="T"></typeparam>
42         /// <param name="XmlString"></param>
43         /// <returns></returns>
44         public static T XmlDeserialize<T>(this string XmlString)
45         {
46             if (string.IsNullOrEmpty(XmlString))
47                 throw new ArgumentNullException("s");         
48 
49             using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(XmlString)))
50             {
51                 using (var xr = XmlReader.Create(ms))
52                 {
53                     var xmlSerializer = new XmlSerializer(typeof(T));
54                     return (T)xmlSerializer.Deserialize(xr);
55                 }
56             }
57         }
58 
59         /// <summary>
60         /// XML保存到本地
61         /// </summary>
62         /// <param name="strXml"></param>
63         /// <returns></returns>
64         public static void SavaToFile(string strXml)
65         {
66             string filepath = "d:\\Log\\";
67             if (!Directory.Exists(filepath))
68                 Directory.CreateDirectory(filepath);
69 
70             string fileName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xml";
71             using (FileStream fs = new FileStream(filepath + fileName, FileMode.Create))
72             {
73                 byte[] xmlBytes = Encoding.UTF8.GetBytes(strXml);
74                 fs.Write(xmlBytes, 0, xmlBytes.Length);
75             }
76         }
77     }
78 }

?

轉載于:https://www.cnblogs.com/sunwenqi/p/11044009.html

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

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

相關文章

CODE[VS] 3411 洪水

題目描述 Description小浣熊松松和朋友到野外露營&#xff0c;沒想到遇上了&pi;年一次的大洪水&#xff0c;好在松松是一只愛觀察的小浣熊&#xff0c;他發現露營地的地形和洪水有如下性質&#xff1a; ①露營地可以被看做是一個N*M的矩形方陣&#xff0c;其中左上角坐標為…

JavaScript --- 取得鼠標事件的坐標

說明: clientX和clientY屬性&#xff1a;事件發生時,鼠標指針在視口中的水平和垂直坐標。pageX和pageY屬性&#xff1a;鼠標光標在頁面中的位置。screenX和screenY屬性&#xff1a;鼠標事件發生時&#xff0c;鼠標指針相對于整個屏幕的坐標信息。IE8及更早的版本不支持事件對象…

JavaScript語義基礎

變量&#xff08;Variables&#xff09; Variables是你存儲數據的容器。聲明一個變量需要使用關鍵字var&#xff0c;然后輸入變量的名稱。 1 var myvar; 定義一個變量后&#xff0c;可以賦予變量一個值&#xff1a; 1 myvar "mxp"; 可以將上述操作寫在一行&#x…

spring面試專題一點通,再也不用擔心面試不會回答了

前言文章內容有點小長&#xff0c;希望你能耐心閱讀&#xff0c;更多Java面試題以及學習資料獲取方式&#xff1a;加Qun:1017-599-436免費獲取。還有更多包括電子書&#xff0c;PDF文檔以及視頻精講可以分享給大家&#xff0c;內容覆蓋很廣&#xff0c;分布式緩存、RPC 調用、Z…

bzoj4033 [HAOI2015]樹上染色

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4033 重要的思路&#xff1a;與其考慮每一個點對的貢獻&#xff0c;不如考慮每條邊的貢獻&#xff08;被經過了幾次&#xff09;&#xff01; 樹形dp。 總共的黑點和白點的個數都是已知的&#xff0c;所以知…

JavaScript --- 表單focus,blur,change事件的實現

假設有一個文本框&#xff0c;我們只允許用戶輸入數值。為此&#xff0c;我們希望: 1.利用focus事件修改文本框內容&#xff0c; 2.利用blur事件回復文本框的內容, 3.利用change事件在用戶輸入了非數值字符時再次修改背景顏色。 var EventUtil {addHandler: function(element…

mysql日期格式轉化

select DATE_FORMAT( 20170701, %Y-%m-%d);先挖坑轉載于:https://www.cnblogs.com/tuhooo/p/7766221.html

Solr管理頁面 上

DashBoard&#xff08;儀表盤&#xff09;Logging&#xff08;日志&#xff09;Core Admin&#xff08;Core管理&#xff09;在Solr中&#xff0c;每一個Core&#xff0c;代表一個索引庫&#xff0c;里面包含索引數據及其配置信息。Solr中可以擁有多個Core&#xff0c;也就同時…

GRPC協議的相關原理

GRPC的Client與Server&#xff0c;均通過Netty Channel作為數據通信&#xff0c;序列化、反序列化則使用Protobuf&#xff0c;每個請求都將被封裝成HTTP2的Stream&#xff0c;在整個生命周期中&#xff0c;客戶端Channel應該保持長連接&#xff0c;而不是每次調用重新創建Chann…

Echarts --- 各個省份的坐標

純手打…效果如下 1.新疆: [86.61 , 40.79] 2.西藏:[89.13 , 30.66] 3.黑龍江:[128.34 , 47.05] 4.吉林:[126.32 , 43.38] 5.遼寧:[123.42 , 41.29] 6.內蒙古:[112.17 , 42.81] 7.北京:[116.40 , 40.40 ] 8.寧夏:[106.27 , 36.76] 9.山西:[111.95,37.65] 10.河北:[115.21 , 38.…

xxx征集系統項目目標文檔

問題 每四人一組&#xff0c;討論結束后&#xff0c;每人根據課堂討論結果提交一份系統利益相關者案例。撰寫撰寫項目目標文檔&#xff08;目標&#xff0c;好處&#xff0c;度量標準。&#xff09; 項目目標文檔 目標&#xff1a; &#xff08;1&#xff09;需求填報 &#xf…

高并發大流量專題---10、MySQL數據庫層的優化

高并發大流量專題---10、MySQL數據庫層的優化 一、總結 一句話總結&#xff1a; mysql先考慮做分布式緩存&#xff0c;過了緩存后就做mysql數據庫層面的優化 1、mysql數據庫層的優化的前面一層是什么&#xff1f; 數據庫緩存&#xff1a;突破了數據庫緩存就需要做mysql數據庫層…

【彩彩只能變身隊】后端工作總結

2018.06.09 早上8點到晚上10點 沖刺前后端交互(vueexpressmysql) 8&#xff1a;00-12&#xff1a;00 &#xff1a; 前端把請求寫好&#xff1a; <template> <div class"LoginForm"> <el-form ref"form" label-width"80px"…

web安全

web安全 DOS命令 web攻防必備課筆記 慕課xss學習 阮一峰&#xff1a;MVC、MVP和MVVM的圖示轉載于:https://www.cnblogs.com/hanxuming/p/7774092.html

JavaScript --- 渲染數據量大的數組

很多時候&#xff0c;需要在頁面上展示從后臺來的大量數據,如果一次性渲染&#xff0c;會影響用戶的體驗。(而且瀏覽器中的JS嚴格限制了資源) /* *使用分組的思想來渲染大量的數組 *parmas array 要處理的數組 *params process 對數組中每一個item進行的操作 *parmas context …

Jquery操作select小結

每次操作select都要查資料&#xff0c;干脆總結一下。 為select設置placeholder <select class"form-control selOP" placeholder"Pick Orchestration Plan"><option value"" disabled selected styledisplay:none;>Pick Orchestrat…

第六講:PrintClient工具的使用

一些簡單命令&#xff1a; cp -rf 源目錄 目的目錄 chmod -R 777 文件名 motelist 查看節點路徑 make telosb 編譯代碼 make telosb reinstall 下載但不編譯 make telosb install 編譯并且下載 make telosb install, 2 bsl,/dev/ttyUSB0 下載指定路徑 java net.tinyos.tools.Li…

SQL Server

查看數據庫服務器名稱&#xff1a;tracert 192.168.10.01 轉載于:https://www.cnblogs.com/hongwei2085/p/9174760.html

css --- 選擇器

標簽選擇器 // 標簽選擇器是最簡單的選擇器, 它的命名只要和對應的HTML標簽相同即可 h1 {font-size: 30px;color: #333; }類選擇器 // 類選擇器也稱為class選擇器,它的語法非常簡單,在class名稱前面加上一個"."符號 <div class"red content"></…

C++標準輸入流、輸出流以及文件流

1、流的控制 iomanip 在使用格式化I/O時應包含此頭文件。 stdiostream 用于混合使用C和C 的I/O機制時&#xff0c;例如想將C程序轉變為C程序 2、類繼承關系 ios是抽象基類&#xff0c;由它派生出istream類和ostream類&#xff0c; iostream類支持輸入輸出操作&…