欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

    C#使用log4net記錄日志

    本文詳細(xì)講解了C#使用log4net記錄日志的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C#實(shí)現(xiàn)treeview綁定的方法

    C#實(shí)現(xiàn)treeview綁定的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)treeview綁定的方法,包括datatable的獲取與節(jié)點(diǎn)的操作,具有一定的參考價(jià)值,需要的朋友可以參考下
    2014-12-12
  • C#實(shí)現(xiàn)自定義ListBox背景的示例詳解

    C#實(shí)現(xiàn)自定義ListBox背景的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)自定義ListBox背景,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • datagridview實(shí)現(xiàn)手動(dòng)添加行數(shù)據(jù)

    datagridview實(shí)現(xiàn)手動(dòng)添加行數(shù)據(jù)

    這篇文章主要介紹了datagridview實(shí)現(xiàn)手動(dòng)添加行數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • C#中IList 與 List 的區(qū)別小結(jié)

    C#中IList 與 List 的區(qū)別小結(jié)

    IList 接口和 List 類是 C# 中用于集合操作的兩個(gè)重要的類型,本文主要介紹了C#中IList 與 List 的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法

    C#實(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-02
  • C#中XmlTextWriter讀寫(xiě)xml文件詳細(xì)介紹

    C#中XmlTextWriter讀寫(xiě)xml文件詳細(xì)介紹

    .NET中包含了很多支持XML的類,這些類使得程序員使用XML編程就如同理解XML文件一樣簡(jiǎn)單。在這篇文章中,我將給出這樣的一個(gè)類的使用示例,這個(gè)類就是XmlTextWriter類
    2013-04-04
  • 使用c#+IMap實(shí)現(xiàn)收取163郵件

    使用c#+IMap實(shí)現(xiàn)收取163郵件

    本文給大家推薦的是使用c#+IMap實(shí)現(xiàn)收取163郵件的具體方法和示例代碼,并附上了smtp郵箱發(fā)送郵件的代碼,有需要的小伙伴可以參考下
    2018-02-02
  • 基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲

    基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲

    這篇文章主要為大家詳細(xì)介紹了基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 在WPF中合并兩個(gè)ObservableCollection集合

    在WPF中合并兩個(gè)ObservableCollection集合

    這篇文章介紹了在WPF中合并兩個(gè)ObservableCollection集合的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論