0

0

XML序列化与反序列化 C#对象与XML互转实现

月夜之吻

月夜之吻

发布时间:2026-03-18 16:27:14

|

621人浏览过

|

来源于php中文网

原创

XmlSerializer序列化失败的根本原因是类型缺少无参构造函数、字段/属性访问受限或使用不支持的泛型集合;实操需确保public可写属性、避免Dictionary<string,object>、正确处理命名空间与静态复用实例。

xml序列化与反序列化 c#对象与xml互转实现

XmlSerializer 序列化时抛出“无法序列化类型 XXX”错误

根本原因是 XmlSerializer 要求目标类型必须有无参构造函数,且所有要序列化的字段/属性不能是 readonly、不能是 internalprivate set(除非用 [XmlElement] 显式标记),也不能是泛型集合(如 List<T> 本身可序列化,但 IEnumerable<T> 不行)。

实操建议:

  • 检查类中是否存在 private readonly string _name; 这类字段——改成自动属性 public string Name { get; set; },或加 [XmlElement] 并确保有 public setter
  • 避免用 Dictionary<string, object> 直接序列化——它不支持 XML 序列化;改用 XmlSerializer 支持的类型,如 List<KeyValuePair<string, string>>,或自定义包装类
  • 如果类里有 DateTimeOffset 字段,默认会序列化为带偏移的字符串(如 2024-01-01T12:00:00+08:00),但反序列化时可能失败(.NET Framework 4.7.2 以前版本不支持);稳妥做法是改用 DateTime + [XmlAttribute] 控制格式

用 XmlSerializer 反序列化 XML 字符串时返回 null 或抛出 InvalidOperationException

常见于 XML 根元素名与目标类型名不一致,或命名空间不匹配。例如 XML 是 <Person xmlns="http://example.com/ns">...,但没在 XmlSerializer 构造时传入对应 XmlRootAttribute

实操建议:

  • 确认 XML 字符串首尾无 BOM 或不可见空白——XmlSerializer.Deserialize(new StringReader(xml.Trim())) 更安全
  • 如果 XML 含默认命名空间(xmlns="xxx"),必须显式指定:var root = new XmlRootAttribute { ElementName = "Person", Namespace = "http://example.com/ns" };,再传给 new XmlSerializer(typeof(Person), root)
  • 反序列化前建议先用 XDocument.Parse(xml) 验证 XML 是否合法——避免把格式错误当成类型问题排查

需要控制 XML 输出格式:去掉 xsi:type、添加 CDATA、调整缩进

XmlSerializer 默认不生成 xsi:type,但如果你用了多态(如基类变量引用子类实例),又没用 [XmlInclude] 声明子类,就会静默失败或输出异常内容;CDATA 和缩进则需配合 XmlWriterSettings

Riffo
Riffo

Riffo是一个免费的文件智能命名和管理工具

下载

实操建议:

  • 多态序列化必须加 [XmlInclude(typeof(Manager))] 到基类上,否则子类字段会被忽略
  • 想让某个字符串字段输出为 CDATA?不行——XmlSerializer 不支持。得换 XmlDocumentXElement 手动构建,或用 IXmlSerializable 自定义序列化逻辑
  • 缩进和换行靠 XmlWriterSettingsnew XmlWriterSettings { Indent = true, IndentChars = " ", NewLineChars = "\n" },但注意:.NET Core 3.1+ 中 XmlWriter.Createsettings.CloseOutput 默认为 true,若写入 MemoryStream 后立刻读取,需设为 false 或调用 Flush()

XmlSerializer 性能差、初始化慢,高频调用场景怎么办

XmlSerializer 构造函数内部会动态生成并编译 C# 类(以 XmlSerializer*.dll 形式缓存在临时目录),首次调用耗时明显,尤其在 Web API 等短生命周期场景下容易被误判为“卡顿”。

实操建议:

  • 务必复用 XmlSerializer 实例——它是线程安全的,全局静态缓存一个即可:private static readonly XmlSerializer _serializer = new XmlSerializer(typeof(Order));
  • 不要在方法内 new XmlSerializer,哪怕加了 typeof(T) 缓存逻辑——反射开销大,且 .NET 已内置类型级缓存
  • 如果真要极致性能(比如每秒数千次序列化),考虑改用 System.Text.Json(虽不直接支持 XML),或预生成序列化程序集(sgen.exe,仅限 .NET Framework);不过绝大多数业务场景,复用实例已足够

最常被忽略的是命名空间处理和静态实例复用——这两个点不处理,调试时要么反序列化失败,要么压测时 CPU 突增,但错误日志里完全看不出关联。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1950

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2120

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1180

2024.11.28

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

5

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

21

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

137

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

14

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

14

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

7

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号