C#如何序列化对象为XML XmlSerializer用法
技术百科
幻夢星雲
发布时间:2026-01-02
浏览: 次 XmlSerializer 是 C# 中轻量级 XML 序列化工具,支持 POCO 类的序列化与反序列化,需配合 XmlRoot、XmlElement 等特性控制结构,原生支持数组和 List,但不支持 Dictionary;注意编码、XML 声明、性能缓存及类型限制。
XmlSerializer 是 C# 中最常用、最轻量的 XML 序列化工具,适合将简单对象(尤其是 POCO 类)快速转为 XML 字符串或文件,也支持反序列化。它不依赖属性标记也能工作,但要控制输出结构,必须配合 [XmlRoot]、[XmlElement]、[XmlAttribute] 等特性使用。
基础用法:默认序列化
只要类有公共读写属性或字段,且有无参构造函数,就能直接序列化:
- 创建
XmlSerializer实例时传入类型(如new XmlSerializer(typeof(Person))) - 调用
Serialize()方法,传入TextWriter或Stream(如StringWriter或FileStream) - 反序列化用
Deserialize(),传入TextReader或Stream
注意:私有成员、只读属性、泛型集合(如 List)默认可序列化,但字典(Dictionary)不支持,需换用 SerializableDictionary 或自定义处理。
控制 XML 结构:常用特性
用特性精确指定节点名、顺序、是否为属性、是否忽略等:
-
[XmlRoot("Customer")]—— 指定根元素名称 -
[XmlElement("Name")]—— 将属性映射为子元素(可设Order = 1控制顺序) -
[XmlAttribute("id")]—— 将属性作为 XML 属性输出 -
[XmlIgnore]—— 跳过该字段/属性 -
[XmlElement(IsNullable = true)]—— 允许输出
例如:public string FirstName { get; set; } 加上 [XmlElement("first-name")],就会生成 。
处理集合与嵌套对象
XmlSerializer 原生支持数组和 
List,但需注意:
- 集合属性名默认作为父节点,内部每个项用
包裹(可通过[XmlArray("Orders")]和[XmlArrayItem("Order")]自定义) - 嵌套对象自动递归序列化,无需额外配置(前提是嵌套类也满足可序列化条件)
- 若集合项类型不唯一(如基类含多个子类),需用
[XmlInclude(typeof(SubClass))]提前声明
实用技巧与避坑提醒
实际开发中容易遇到的问题和应对方式:
-
中文乱码?用
XmlWriter.Create(stream, new XmlWriterSettings { Encoding = Encoding.UTF8 })显式指定编码 - 想省略 XML 声明(
)?设置XmlWriterSettings.OmitXmlDeclaration = true - 性能敏感场景?
XmlSerializer会为每个类型动态生成临时程序集,首次序列化较慢;可提前调用new XmlSerializer(type)缓存实例复用 - 无法序列化接口、委托、指针、非公共构造函数——这些是硬性限制,需改用
DataContractSerializer或 JSON 替代
不复杂但容易忽略。
# 就会
# 就能
# 尤其是
# 多个
# 也能
# 首次
# 自定义
# public
# 工具
# js
# json
# 递归
# 对象
# String
# 泛型
# 编码
# 指针
# 中文乱码
# stream
# c#
# 子类
# 构造函数
# xml
# 字符串
# 接口
# FileStream
# 委托
# nil
# typeof
# 序列化
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10系统怎么查看端口状态_Windows10
- Win11怎么把图标拖到任务栏_Win11固定应用
- c++怎么实现高并发下的无锁队列_c++ std:
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- Win11怎么关闭贴靠布局_Win11禁用窗口最大
- 如何在 Go 中正确初始化结构体中的 map 字段
- c++中如何对数组进行排序_c++数组排序算法汇总
- Python与OpenAI接口集成实战_生成式AI
- 如何在Golang中写入XML文件_生成符合规范的
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- Windows10怎么备份注册表_Windows1
- Win11怎么关闭自动更新 Win11永久关闭系统
- GML (Geography Markup Lan
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Python路径拼接规范_跨平台处理说明【指导】
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Windows蓝屏错误0x00000018怎么处理
- c++中如何进行二进制文件读写_c++ read与
- 如何快速验证Golang安装是否成功_运行go v
- 如何理解Go指针和内存分配关系_Go Pointe
- Win11键盘快捷键大全_Windows 11常用
- 如何使用Golang搭建Web开发环境_快速启动H
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- Win11怎么忘记WiFi网络_Win11删除已保
- Mac如何设置动态壁纸?(让桌面动起来)
- Win11怎么开启智能存储_Windows11存储
- php485函数怎么捕获异常_php485错误处理
- 如何在Golang中配置代码格式化工具_使用gof
- 如何使用Golang table-driven f
- php打包exe如何加密代码_防反编译保护方法【技
- Win11怎么设置环境变量_Win11配置Path
- Python面向对象实战讲解_类与设计模式深入理解
- Win11截图快捷键是什么_Win11自带截图工具
- Windows10怎么卸载预装软件_Windows
- 小程序里php怎么变mp4_小程序调用php生成m
- TestNG的testng.xml配置文件怎么写
- Golang如何遍历目录文件_Golang fil
- Win11怎么开启自动HDR画质_Windows1
- Windows怎样关闭Edge新标签页广告_Win
- Win11局域网共享怎么设置 Win11文件夹网络
- Win10如何备份驱动程序_Win10驱动备份步骤
- 如何将文本文件中的竖排字符串转换为横排字符串
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Win11怎么设置开机问候语_自定义Win11锁屏
- c++怎么处理多线程死锁_c++ lock_gua
- Windows蓝屏BAD_POOL_HEADER故
- Windows系统文件被保护机制阻止怎么办_权限不
- Win11怎么查看电脑配置_Win11硬件配置详细
- Win11怎么设置快速访问主页_Windows11
- Win11怎么打开旧版计算器_Win11恢复传统计

QQ客服