• 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
  • 相关阅读:
    生产部长修炼宝典②:企业如何利用大数据分析平台实现生产异常的快反和处置?
    前后端联调可能出现的问题
    磨金石教育摄影技能干货分享|传统民居摄影作品欣赏
    TracerLPM_V_B2_9
    【UML用户指南】-01-UML基本元素的介绍(一)
    【PNR#2 Div1 D】找零(DP)(贪心)
    inscode连接不上gpu,持续8小时,为了数据不丢失续费了6小时,我只想知道什么时候可以连接
    realEngine(UE4)实现开关门效果
    【技术分享】堆叠交换机替换指导
    【BUG】记一次Maven install 报错 Could not find artifact ...:pom:0.0.1-SNAPSHOT
  • 原文地址:https://blog.csdn.net/qq_36437991/article/details/132805397