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)過百度學習,發(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)文章
C#使用Spire.Doc?for?.NET實現(xiàn)批量接受或拒絕Word的修訂內(nèi)容
Microsoft?Word?的修訂功能可以記錄文檔中的修改、校對、更正,以及他人添加的建議和批注,本文將演示如何使用?Spire.Doc?for?.NET,通過代碼的方式批量接受或拒絕?Word?文檔中的所有修訂內(nèi)容,感興趣的小伙伴可以了解下2026-01-01
C# 中 WebSocket 與 SignalR實時通信的兩種方案
在現(xiàn)代 Web 應用中,實時通信變得越來越重要,無論是聊天應用、在線游戲、股票行情推送還是協(xié)作編輯工具,都需要服務(wù)器能夠主動向客戶端推送數(shù)據(jù),本文將對這兩種技術(shù)進行比較,分析它們的異同點和使用場景,并提供簡單示例代碼幫助你快速上手,感興趣的朋友一起看看吧2025-05-05
C#使用Spire.XLS for .NET將List數(shù)據(jù)導出Excel的操作指南
在現(xiàn)代數(shù)據(jù)驅(qū)動的應用開發(fā)中,將程序內(nèi)存中的數(shù)據(jù)以結(jié)構(gòu)化的形式呈現(xiàn)給用戶是一個普遍的需求,其中,將C# List集合中的數(shù)據(jù)導出到Excel文件,成為了開發(fā)者們經(jīng)常需要實現(xiàn)的功能,本文將介紹如何使用 Spire.XLS for .NET將 List<T> 數(shù)據(jù)寫入Excel文件,需要的朋友可以參考下2026-02-02

