C#?xml序列化實現(xiàn)及遇到的坑
XML序列化是將對象轉(zhuǎn)化為XML文檔的過程。在C#中,當我們需要將對象存儲到文件或通過網(wǎng)絡(luò)發(fā)送時,我們可以使用XML序列化將C#對象轉(zhuǎn)換為XML文檔,以便于存儲、傳輸和還原。同時,XML序列化也可以將已經(jīng)存在的XML文檔還原為C#對象。
需求:需要將對象進行xml序列化,不想包含xml聲明也不想格式化
通過百度找到了如下的方法
/// <summary>
/// 對象轉(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))
{
// 強制指定命名空間,覆蓋默認的命名空間
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)請求頭前面有東西,因為他和普通輸入的尖括號不一樣,下面的兩句代碼看著是一樣的但是具體運行起來就不一樣了
var a1= Encoding.UTF8.GetBytes("<");
var a2 = Encoding.UTF8.GetBytes("?<");
通過轉(zhuǎn)化為byte查看,他倆字節(jié)長度都不一樣

第二個比第一個多了三個特殊的字符,經(jīng)過了解,239 187 191是utf-8 bom的前綴,所以xml序列化之后是utf-8 bom格式的,現(xiàn)在需要不是bom格式的,經(jīng)過百度學(xué)習,發(fā)現(xiàn) new UTF8Encoding(false); 這樣的utf-8生成的字符串就不是帶BOM得了,所以修改代碼如下
/// <summary>
/// 對象轉(zhuǎn)化為xml字符串
/// </summary>
/// <param name="obj"></param>
/// <param name="isNeedHeader">是否需要xml聲明頭,默認不需要</param>
/// <param name="isFormat">是否需要格式化xml,默認不需要</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))
{
// 強制指定命名空間,覆蓋默認的命名空間
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序列化實現(xiàn)及遇到的坑的文章就介紹到這了,更多相關(guān)C# xml序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
datagridview實現(xiàn)手動添加行數(shù)據(jù)
這篇文章主要介紹了datagridview實現(xiàn)手動添加行數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
C#中IList 與 List 的區(qū)別小結(jié)
IList 接口和 List 類是 C# 中用于集合操作的兩個重要的類型,本文主要介紹了C#中IList 與 List 的區(qū)別小結(jié),具有一定的參考價值,感興趣的可以了解一下2024-04-04
C#實現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法
這篇文章主要介紹了C#實現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法,結(jié)合實例形式簡單分析了C#字符數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)字符數(shù)組的具體實現(xiàn)技巧,需要的朋友可以參考下2017-02-02
基于C#的winform實現(xiàn)數(shù)字華容道游戲
這篇文章主要為大家詳細介紹了基于C#的winform實現(xiàn)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
在WPF中合并兩個ObservableCollection集合
這篇文章介紹了在WPF中合并兩個ObservableCollection集合的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

