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; ?>
】
相关推荐
- 如何在 Windows 11 中使用 AlomWa
- Win11怎么关闭系统声音_Win11系统提示音静
- Win11怎么关闭透明效果_Windows11辅助
- Win11怎么连接投影仪_Win11多显示器投屏设
- Python列表推导式与字典推导式教程_简化代码高
- Python抽象类与接口设计_规范说明【指导】
- Linux如何使用grep搜索文件内容_Linux
- Windows10电脑怎么设置防火墙出站规则_Wi
- PythonFastAPI项目实战教程_API接口
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- Win11如何添加/删除输入法 Win11切换中英
- Win11怎么设置屏保时间_调整Win11屏幕保护
- c++中如何使用虚函数实现多态_c++多态性实现原
- windows如何测试网速_windows系统网络
- 如何在Golang中验证模块完整性_Golangg
- LINUX怎么查看进程_LINUX ps命令查看运
- Win11怎么更改文件夹图标_自定义Win11文件
- Win11如何设置开机自动联网 Win11宽带连接
- Win11如何隐藏桌面图标 Win11一键隐藏/显
- 如何在 Go 中比较自定义的数组类型(如 [20]
- 手机php怎么转mp4_手机端php文件转mp4a
- Win11怎么设置开机密码_Windows11账户
- C++中的协变与逆变是什么?C++函数指针与返回类
- 如何在Golang中实现CI/CD流水线自动化测试
- 如何使用Golang优化模块引入路径_Golang
- php能跑在stm32上吗_php在stm32微控
- 如何将文本文件中的竖排字符串转换为横排字符串
- Windows如何使用注册表查找和删除项?(reg
- 为什么本地php环境运行php脚本卡顿_php执行
- Win10怎样清理C盘爱奇艺缓存_Win10清理爱
- Win11怎么设置夜间模式_Windows11显示
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- Python文件管理规范_工程实践说明【指导】
- Python字符串处理进阶_切片方法解析【指导】
- Win11怎么检查TPM2.0模块_Windows
- Win11怎么关闭系统透明度_Windows11个
- 如何在 Pandas 中按元素交集合并两列字符串
- php转mp4怎么设置帧率_调整php生成mp4视
- c++23 std::expected怎么用 c+
- Python 中将 ISO 8601 时间戳转换为
- Win11怎么调整屏幕亮度_Windows 11调
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Win10怎么更改用户名 Win10修改账户名称操
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- 如何在Golang中优化文件读写性能_使用缓冲和并
- c++如何实现一个高性能的环形队列(Ring Bu
- php8.4新语法match怎么用_php8.4m
- Win11如何设置ipv6 Win11开启IPv6
- Win11怎么关闭搜索历史 Win11清除搜索框最

QQ客服