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

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

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

cs 复制代码
/// <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;
    }
}

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

cs 复制代码
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得了,所以修改代码如下

cs 复制代码
/// <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;
    }
}
相关推荐
影寂ldy5 分钟前
C# TCP转串口Modbus网关终极完整版笔记(队列防抖+一问一答+帧解析+双客户端轮询)
笔记·tcp/ip·c#
牧瀬クリスだ13 分钟前
Mybatis-Plus:让CRUD快如闪电
java·spring boot·spring·tomcat·mybatis·yml
盐焗鹌鹑蛋21 分钟前
【Linux】线程概念和控制
java·linux·服务器
CarIise33 分钟前
MyBatis缓存与分页插件:从一级二级缓存到底层原理与PageHelper实战
java·开发语言·spring
宸津-代码粉碎机7 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
噢,我明白了8 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅8 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
考虑考虑8 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1119 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383009 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析