C#如何序列化整个BindingList数据源为单个XML文件
问题原因
现有逻辑遍历BindingList<CompanyProfile>中的每个CompanyProfile对象,为每个对象单独执行序列化生成独立文件,最终输出的文件数和集合条目数一致。要生成包含所有记录的单个XML文件,直接序列化整个集合对象即可,无需循环处理单个条目。
具体实现
- 移除遍历单条记录调用序列化方法的循环逻辑
- 调整序列化方法的入参类型,支持接收整个
BindingList<CompanyProfile>集合 - 序列化时可自定义XML根节点名称,让输出的文件结构更清晰易读
调用逻辑修改
将原来的循环序列化代码替换为以下逻辑,只指定一个统一的输出文件路径:
// 指定单个汇总文件的存储路径 string outputFilePath = Path.Combine(appData, "AllCompanyProfiles.xml"); // 直接传入整个DataSource集合进行序列化 CreateAllClientFile(DataSource, outputFilePath); // 打开生成的文件查看结果 Process.Start("notepad.exe", outputFilePath);
序列化方法实现
新增对应集合序列化的方法,代码如下:
private void CreateAllClientFile(BindingList<CompanyProfile> dataSource, string fileName) { // 声明序列化器,指定序列化类型为BindingList<CompanyProfile>,同时自定义根节点名称 XmlSerializer serializer = new XmlSerializer( typeof(BindingList<CompanyProfile>), new XmlRootAttribute("CompanyProfileList") ); using (StreamWriter writer = new StreamWriter(fileName)) { // 一次性序列化整个集合到单个文件 serializer.Serialize(writer, dataSource); } }
输出效果
生成的XML文件结构示例如下,所有CompanyProfile记录都会被包含在同一个根节点下:
<?xml version="1.0" encoding="utf-8"?> <CompanyProfileList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CompanyProfile> <CompanyName>测试企业A</CompanyName> <SiteName>站点A</SiteName> <IMO>Some Value</IMO> </CompanyProfile> <CompanyProfile> <CompanyName>测试企业B</CompanyName> <SiteName>站点B</SiteName> <IMO>Some Value</IMO> </CompanyProfile> </CompanyProfileList>
注意事项
- 需要在代码文件头部引入命名空间
using System.Xml.Serialization;,否则XmlRootAttribute无法正常使用 - 后续如果需要反序列化读取该XML文件,保持序列化器的类型和根节点配置一致即可,不需要额外拆分处理单条记录
内容的提问来源于stack exchange,提问作者ElectricRay81
相关产品推荐
相关产品推荐

