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的修订内容
Microsoft Word 的修订功能可以记录文档中的修改、校对、更正,以及他人添加的建议和批注,本文将演示如何使用 Spire.Doc for .NET,通过代码的方式批量接受或拒绝 Word 文档中的所有修订内容,感兴趣的小伙伴可以了解下2026-01-01
C# 中 WebSocket 与 SignalR实时通信的两种方案
在现代 Web 应用中,实时通信变得越来越重要,无论是聊天应用、在线游戏、股票行情推送还是协作编辑工具,都需要服务器能够主动向客户端推送数据,本文将对这两种技术进行比较,分析它们的异同点和使用场景,并提供简单示例代码帮助你快速上手,感兴趣的朋友一起看看吧2025-05-05
C#使用Spire.XLS for .NET将List数据导出Excel的操作指南
在现代数据驱动的应用开发中,将程序内存中的数据以结构化的形式呈现给用户是一个普遍的需求,其中,将C# List集合中的数据导出到Excel文件,成为了开发者们经常需要实现的功能,本文将介绍如何使用 Spire.XLS for .NET将 List<T> 数据写入Excel文件,需要的朋友可以参考下2026-02-02


最新评论