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;
    }
}
相关推荐
逆风局?2 分钟前
Java基础——分层解耦——IOC和DI入门
java·开发语言
ybq1951334543122 分钟前
javaEE-8.JVM(八股文系列)
java·jvm·java-ee
xcLeigh30 分钟前
WPF进阶 | WPF 样式与模板:打造个性化用户界面的利器
ui·c#·wpf
VB.Net41 分钟前
17.2 图形绘制6
c#·图像
飞翔的佩奇1 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的疾病防控综合管理系统(含源码+数据库+毕业论文)
java·数据库·spring boot·mysql·spring·毕业设计·疾病防控
power-辰南1 小时前
技术架构师成长路线(2025版)
java·架构师·学习路线·技术专家
二十雨辰1 小时前
[Java基础]面向对象
java·开发语言
栗豆包2 小时前
w187社区养老服务平台的设计与实现
java·spring boot·后端·spring·tomcat
violin-wang2 小时前
如何在Intellij IDEA中识别一个文件夹下的多个Maven module?
java·spring boot·spring·maven·intellij-idea
假客套2 小时前
Java小白入门教程:LinkedList
java·开发语言