C# xml序列化实现及遇到的坑

 更新时间:2023年09月12日 10:08:57   作者:假装我不帅  
在C#中,当我们需要将对象存储到文件或通过网络发送时,我们可以使用XML序列化将C#对象转换为XML文档,以便于存储、传输和还原,本文主要介绍了C# xml序列化实现及遇到的坑,感兴趣的可以了解一下

XML序列化是将对象转化为XML文档的过程。在C#中,当我们需要将对象存储到文件或通过网络发送时,我们可以使用XML序列化将C#对象转换为XML文档,以便于存储、传输和还原。同时,XML序列化也可以将已经存在的XML文档还原为C#对象。

需求:需要将对象进行xml序列化,不想包含xml声明也不想格式化

通过百度找到了如下的方法

/// <summary>
/// 对象转化为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;
    }
}

但是发现请求头前面有东西,因为他和普通输入的尖括号不一样,下面的两句代码看着是一样的但是具体运行起来就不一样了

var a1= Encoding.UTF8.GetBytes("<");
var a2 = Encoding.UTF8.GetBytes("<");

通过转化为byte查看,他俩字节长度都不一样

第二个比第一个多了三个特殊的字符,经过了解,239 187 191是utf-8 bom的前缀,所以xml序列化之后是utf-8 bom格式的,现在需要不是bom格式的,经过百度学习,发现 new UTF8Encoding(false); 这样的utf-8生成的字符串就不是带BOM得了,所以修改代码如下

/// <summary>
/// 对象转化为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;
    }
}

到此这篇关于C# xml序列化实现及遇到的坑的文章就介绍到这了,更多相关C# xml序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#使用Spire.Doc for .NET实现批量接受或拒绝Word的修订内容

    C#使用Spire.Doc for .NET实现批量接受或拒绝Word的修订内容

    Microsoft Word 的修订功能可以记录文档中的修改、校对、更正,以及他人添加的建议和批注,本文将演示如何使用 Spire.Doc for .NET,通过代码的方式批量接受或拒绝 Word 文档中的所有修订内容,感兴趣的小伙伴可以了解下
    2026-01-01
  • Directory文件类的实例讲解

    Directory文件类的实例讲解

    下面小编就为大家分享一篇Directory文件类的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • C#从前面或后面按指定数量删除字符串

    C#从前面或后面按指定数量删除字符串

    这篇文章介绍了C#从前面或后面按指定数量删除字符串的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 简单聊聊C#的线程本地存储TLS到底是什么

    简单聊聊C#的线程本地存储TLS到底是什么

    C#的ThreadStatic是假的,因为C#完全是由CLR(C++)承载的,言外之意C#的线程本地存储,用的就是用C++运行时提供的 __declspec(thread)或__thread来虚构的一套玩法,下面我们就来深入讲讲C#的线程本地存储TLS到底是什么吧
    2024-01-01
  • C#中的WPF基本概念详解

    C#中的WPF基本概念详解

    这篇文章主要介绍了C#中的WPF基本概念,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • C#获取数组中最大最小值的方法

    C#获取数组中最大最小值的方法

    这篇文章主要介绍了C#获取数组中最大最小值的方法,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • C# 中 WebSocket 与 SignalR实时通信的两种方案

    C# 中 WebSocket 与 SignalR实时通信的两种方案

    在现代 Web 应用中,实时通信变得越来越重要,无论是聊天应用、在线游戏、股票行情推送还是协作编辑工具,都需要服务器能够主动向客户端推送数据,本文将对这两种技术进行比较,分析它们的异同点和使用场景,并提供简单示例代码帮助你快速上手,感兴趣的朋友一起看看吧
    2025-05-05
  • C#使用Spire.XLS for .NET将List数据导出Excel的操作指南

    C#使用Spire.XLS for .NET将List数据导出Excel的操作指南

    在现代数据驱动的应用开发中,将程序内存中的数据以结构化的形式呈现给用户是一个普遍的需求,其中,将C# List集合中的数据导出到Excel文件,成为了开发者们经常需要实现的功能,本文将介绍如何使用 Spire.XLS for .NET将 List<T> 数据写入Excel文件,需要的朋友可以参考下
    2026-02-02
  • C#获取进程的主窗口句柄的实现方法

    C#获取进程的主窗口句柄的实现方法

    C#获取进程的主窗口句柄的实现方法,需要的朋友可以参考一下
    2013-04-04
  • WPF如何自定义TabControl控件样式示例详解

    WPF如何自定义TabControl控件样式示例详解

    这篇文章主要给大家介绍了关于WPF如何自定义TabControl控件样式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04

最新评论