DataSet内置支持XML双向序列化:WriteXml()可按IgnoreSchema、WriteSchema或DiffGram模式导出数据与结构;ReadXml()自动识别并加载,但默认清空原数据;WriteXmlSchema/ReadXmlSchema用于纯XSD交换。

DataSet 是 .NET 中用于内存中缓存关系型数据的核心类,它天然支持与 XML 的双向序列化——不需要额外引用或第三方库,靠内置方法就能完成转换。
把 DataSet 写成 XML 文件或字符串
DataSet 提供 WriteXml() 方法,可直接导出为 XML 格式。它能保存数据(Rows)、结构(Schema)甚至关系(Relations)和约束(Constraints),具体行为由 XmlWriteMode 控制:
- IgnoreSchema:只写数据,不带表结构(默认)
- WriteSchema:同时写结构和数据,生成自描述 XML(含 <xs:schema>)
- DiffGram:保留原始值和当前值,适合变更跟踪场景(如离线同步)
示例:
ds.WriteXml("data.xml", XmlWriteMode.WriteSchema); // 生成带 schema 的完整 XML从 XML 加载数据到 DataSet
用 ReadXml() 可将 XML 加载回 DataSet。它会自动识别是否含 Schema:
- 如果 XML 包含内联 schema(即 WriteSchema 模式生成的),DataSet 会重建 DataTable 结构并填充数据
- 如果只有数据(IgnoreSchema 模式),DataSet 会尝试推断列类型(如全数字 → Int32),但建议配合 schema 使用以保证准确性
注意:ReadXml 默认会清空原有表内容;若想追加,需先调用 DataSet.Merge() 或手动控制。
只读/只写 Schema(XSD)
若只需交换结构(比如定义接口契约),可用:
- WriteXmlSchema("schema.xsd"):导出纯 XSD 文件
- ReadXmlSchema("schema.xsd"):加载 XSD 并创建空的、结构匹配的 DataSet
这样可实现“先定结构再填数据”的协作流程,避免类型推断偏差。
常见注意事项
转换过程看似简单,但几个细节容易踩坑:
- DateTime 列在 XML 中按 ISO 8601 格式序列化(如 "2024-05-20T14:23:15.123"),时区信息可能丢失(默认按本地时间处理)
- Null 值会序列化为
,ReadXml 能正确还原为 <strong>DBNull.Value</strong></li> <li>DataTable.TableName 和 DataColumn.ColumnName 会原样映射为 XML 元素/属性名,建议避免空格或特殊字符</li> <li>嵌套关系(DataRelation)在 WriteSchema 下会生成 <code><xs:element ref="...">
,ReadXml 可自动重建关联
基本上就这些。只要用对 WriteXml / ReadXml 和对应模式,DataSet 和 XML 之间的来回转换非常直接,也不依赖外部配置。










