最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?xml序列化實現(xiàn)及遇到的坑

 更新時間:2023年09月12日 10:08:57   作者:假裝我不帥  
在C#中,當我們需要將對象存儲到文件或通過網(wǎng)絡(luò)發(fā)送時,我們可以使用XML序列化將C#對象轉(zhuǎn)換為XML文檔,以便于存儲、傳輸和還原,本文主要介紹了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)容

    C#使用Spire.Doc?for?.NET實現(xiàn)批量接受或拒絕Word的修訂內(nèi)容

    Microsoft?Word?的修訂功能可以記錄文檔中的修改、校對、更正,以及他人添加的建議和批注,本文將演示如何使用?Spire.Doc?for?.NET,通過代碼的方式批量接受或拒絕?Word?文檔中的所有修訂內(nèi)容,感興趣的小伙伴可以了解下
    2026-01-01
  • Directory文件類的實例講解

    Directory文件類的實例講解

    下面小編就為大家分享一篇Directory文件類的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • C#從前面或后面按指定數(shù)量刪除字符串

    C#從前面或后面按指定數(shù)量刪除字符串

    這篇文章介紹了C#從前面或后面按指定數(shù)量刪除字符串的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 簡單聊聊C#的線程本地存儲TLS到底是什么

    簡單聊聊C#的線程本地存儲TLS到底是什么

    C#的ThreadStatic是假的,因為C#完全是由CLR(C++)承載的,言外之意C#的線程本地存儲,用的就是用C++運行時提供的 __declspec(thread)或__thread來虛構(gòu)的一套玩法,下面我們就來深入講講C#的線程本地存儲TLS到底是什么吧
    2024-01-01
  • C#中的WPF基本概念詳解

    C#中的WPF基本概念詳解

    這篇文章主要介紹了C#中的WPF基本概念,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • C#獲取數(shù)組中最大最小值的方法

    C#獲取數(shù)組中最大最小值的方法

    這篇文章主要介紹了C#獲取數(shù)組中最大最小值的方法,本文直接給出實例代碼,需要的朋友可以參考下
    2015-06-06
  • C# 中 WebSocket 與 SignalR實時通信的兩種方案

    C# 中 WebSocket 與 SignalR實時通信的兩種方案

    在現(xiàn)代 Web 應用中,實時通信變得越來越重要,無論是聊天應用、在線游戲、股票行情推送還是協(xié)作編輯工具,都需要服務(wù)器能夠主動向客戶端推送數(shù)據(jù),本文將對這兩種技術(shù)進行比較,分析它們的異同點和使用場景,并提供簡單示例代碼幫助你快速上手,感興趣的朋友一起看看吧
    2025-05-05
  • C#使用Spire.XLS for .NET將List數(shù)據(jù)導出Excel的操作指南

    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
  • C#獲取進程的主窗口句柄的實現(xiàn)方法

    C#獲取進程的主窗口句柄的實現(xiàn)方法

    C#獲取進程的主窗口句柄的實現(xiàn)方法,需要的朋友可以參考一下
    2013-04-04
  • WPF如何自定義TabControl控件樣式示例詳解

    WPF如何自定義TabControl控件樣式示例詳解

    這篇文章主要給大家介紹了關(guān)于WPF如何自定義TabControl控件樣式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04

最新評論

顺义区| 利津县| 兰州市| 武胜县| 龙山县| 安西县| 大安市| 湘阴县| 永康市| 柘城县| 隆安县| 青神县| 麦盖提县| 高邑县| 镶黄旗| 揭阳市| 盐边县| 象州县| 黔西县| 洛阳市| 蚌埠市| 峡江县| 抚顺市| 平阳县| 正定县| 冕宁县| 浙江省| 鄂伦春自治旗| 葫芦岛市| 河曲县| 江城| 商丘市| 曲阳县| 云梦县| 武冈市| 兴国县| 高陵县| 贵南县| 海伦市| 若尔盖县| 建昌县|