• C# xml序列化以及遇到的坑


    需求:需要将对象进行xml序列化,不想包含xml声明也不想格式化
    通过百度找到了如下的方法

    /// 
    /// 对象转化为xml字符串
    /// 
    /// 
    /// 
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

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

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

    在这里插入图片描述
    通过转化为byte查看,他俩字节长度都不一样
    在这里插入图片描述
    第二个比第一个多了三个特殊的字符,经过了解,239 187 191是utf-8 bom的前缀,所以xml序列化之后是utf-8 bom格式的,现在需要不是bom格式的,经过百度学习,发现new UTF8Encoding(false);这样的utf-8生成的字符串就不是带BOM得了,所以修改代码如下

    /// 
    /// 对象转化为xml字符串
    /// 
    /// 
    /// 是否需要xml声明头,默认不需要
    /// 是否需要格式化xml,默认不需要
    /// 
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    C++day04(类中特殊成员函数、匿名对象、友元、常成员函数和常对象、运算符重载)
    20. 有效的括号 --力扣 --JAVA
    Java学习之路 —— 多线程
    (原创)基于springboot,vue宠物商城定制版v3.0
    力扣labuladong一刷day4共2题
    drools执行完某个规则后终止别的规则执行
    iTextSharp操作PDF
    毕业前写了20万行代码,让我从成为同学眼里的面霸
    如何利用数据仓库进行业务分析:一名大数据工程师的视角
    【牛客网刷题】(第四弹)多道中等难度题,早日拿offer,快来看看
  • 原文地址:https://blog.csdn.net/qq_36437991/article/details/132805397