C#?xml序列化實(shí)現(xiàn)及遇到的坑
XML序列化是將對(duì)象轉(zhuǎn)化為XML文檔的過(guò)程。在C#中,當(dāng)我們需要將對(duì)象存儲(chǔ)到文件或通過(guò)網(wǎng)絡(luò)發(fā)送時(shí),我們可以使用XML序列化將C#對(duì)象轉(zhuǎn)換為XML文檔,以便于存儲(chǔ)、傳輸和還原。同時(shí),XML序列化也可以將已經(jīng)存在的XML文檔還原為C#對(duì)象。
需求:需要將對(duì)象進(jìn)行xml序列化,不想包含xml聲明也不想格式化
通過(guò)百度找到了如下的方法
/// <summary> /// 對(duì)象轉(zhuǎn)化為xml字符串 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ObjectToXmlString(object obj, bool isNeedHeader = false, bool isFormat = false) { try { XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType()); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; if (isFormat) { settings.Indent = true; settings.IndentChars = " "; settings.NewLineChars = "\r\n"; } if (!isNeedHeader) { settings.OmitXmlDeclaration = true; // 不生成聲明頭 } using (var memoryStream = new MemoryStream()) using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, settings)) { // 強(qiáng)制指定命名空間,覆蓋默認(rèn)的命名空間 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add(string.Empty, string.Empty); xmlSerializer.Serialize(xmlWriter, obj, namespaces); var xmlString = Encoding.UTF8.GetString(memoryStream.ToArray()); return xmlString; }; } catch { return string.Empty; } }
但是發(fā)現(xiàn)請(qǐng)求頭前面有東西,因?yàn)樗推胀ㄝ斎氲募饫ㄌ?hào)不一樣,下面的兩句代碼看著是一樣的但是具體運(yùn)行起來(lái)就不一樣了
var a1= Encoding.UTF8.GetBytes("<"); var a2 = Encoding.UTF8.GetBytes("?<");
通過(guò)轉(zhuǎn)化為byte查看,他倆字節(jié)長(zhǎng)度都不一樣
第二個(gè)比第一個(gè)多了三個(gè)特殊的字符,經(jīng)過(guò)了解,239 187 191是utf-8 bom的前綴,所以xml序列化之后是utf-8 bom格式的,現(xiàn)在需要不是bom格式的,經(jīng)過(guò)百度學(xué)習(xí),發(fā)現(xiàn) new UTF8Encoding(false);
這樣的utf-8生成的字符串就不是帶BOM得了,所以修改代碼如下
/// <summary> /// 對(duì)象轉(zhuǎn)化為xml字符串 /// </summary> /// <param name="obj"></param> /// <param name="isNeedHeader">是否需要xml聲明頭,默認(rèn)不需要</param> /// <param name="isFormat">是否需要格式化xml,默認(rèn)不需要</param> /// <returns></returns> public static string ObjectToXmlString(object obj, bool isNeedHeader = false, bool isFormat = false) { try { XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType()); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = new UTF8Encoding(false);//utf-8不帶BOM //Encoding.UTF8;//utf-8帶BOM if (isFormat) { settings.Indent = true; settings.IndentChars = " "; settings.NewLineChars = "\r\n"; } if (!isNeedHeader) { settings.OmitXmlDeclaration = true; // 不生成聲明頭 } using (var memoryStream = new MemoryStream()) using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, settings)) { // 強(qiáng)制指定命名空間,覆蓋默認(rèn)的命名空間 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add(string.Empty, string.Empty); xmlSerializer.Serialize(xmlWriter, obj, namespaces); var xmlString = Encoding.UTF8.GetString(memoryStream.ToArray()); return xmlString; }; } catch { return string.Empty; } }
到此這篇關(guān)于C# xml序列化實(shí)現(xiàn)及遇到的坑的文章就介紹到這了,更多相關(guān)C# xml序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)自定義ListBox背景的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)自定義ListBox背景,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12datagridview實(shí)現(xiàn)手動(dòng)添加行數(shù)據(jù)
這篇文章主要介紹了datagridview實(shí)現(xiàn)手動(dòng)添加行數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04C#中IList 與 List 的區(qū)別小結(jié)
IList 接口和 List 類是 C# 中用于集合操作的兩個(gè)重要的類型,本文主要介紹了C#中IList 與 List 的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法
這篇文章主要介紹了C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了C#字符數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)字符數(shù)組的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02C#中XmlTextWriter讀寫(xiě)xml文件詳細(xì)介紹
.NET中包含了很多支持XML的類,這些類使得程序員使用XML編程就如同理解XML文件一樣簡(jiǎn)單。在這篇文章中,我將給出這樣的一個(gè)類的使用示例,這個(gè)類就是XmlTextWriter類2013-04-04基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲
這篇文章主要為大家詳細(xì)介紹了基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02在WPF中合并兩個(gè)ObservableCollection集合
這篇文章介紹了在WPF中合并兩個(gè)ObservableCollection集合的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06