如何序列化完整列表而不是逐行



我的DataGridView绑定到这里定义的DataSource:

BindingList<CompanyProfile> DataSource = new BindingList<CompanyProfile>();

其中CompanyProfile类为:

public class CompanyProfile
{
public string CompanyName { get; set; } 
public string SiteName { get; set; }
public string IMO { get; set; } = "Some Value";
} 

现在我想获取整个数据源并编写一个包含所有项的XML文件。之前,我尝试过这样的序列化:

// Iterate the datasource list, not the DataGridView.
foreach (CompanyProfile companyProfile in DataSource)
{
CreateClientFile(
companyProfile,
fileName: Path.Combine(appData,
$"{companyProfile.CompanyName}_{companyProfile.SiteName}.xml")
);
}

CreateClientFile使用XmlSerializer:

private void CreateClientFile(CompanyProfile companyProfile, string fileName)
{
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(CompanyProfile));
using (var writer = new StreamWriter(fileName))
{
x.Serialize(writer, companyProfile);
}
// Open the file to view the result
Process.Start("notepad.exe", fileName);
}

但是我最终为每条记录创建了一个文件。我如何序列化我的数据源,以便它使一个文件与所有CompanyProfile记录在其中?

我真的很想学习和掌握这个概念,开始阅读关于序列化和数据绑定的建议,但我卡住了。

我希望有人愿意进一步帮助我。

详细阐述jdweng的精彩评论。

在您发布的代码中,您通过DataSource并对每个记录使用XmlSerializer。但是,要实现您想要的结果,即DataSource写入单个文件并拥有所有记录,您需要更改序列化器的定义:

XmlSerializer x = new XmlSerializer(
typeof(BindingList<CompanyProfile>), 
new XmlRootAttribute("root"));
另一个更改很容易,因为您使用btnSerialize_Click方法并序列化整个Listx.Serialize(writer, DataSource)行。
private void btnSerialize_Click(object sender, EventArgs e)
{
var fileName = Path.Combine(
appData,
"CompanyProfiles.xml");
using (var writer = new StreamWriter(fileName))
{
x.Serialize(writer, DataSource);
}
Process.Start("notepad.exe", fileName);
}

您的文件现在具有正确的文档结构,因为有一个root节点。两个CompanyProfile记录的数据位于root节点下:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<CompanyProfile>
<CompanyName>Linear Technology</CompanyName>
<SiteName>Colorado Design Center</SiteName>
<IMO>Some Value</IMO>
</CompanyProfile>
<CompanyProfile>
<CompanyName>Analog Devices</CompanyName>
<SiteName>1-1-2</SiteName>
<IMO>Some Value</IMO>
</CompanyProfile>
</root>

我希望这将有助于您实现学习更多序列化知识的目标。

相关内容

  • 没有找到相关文章

最新更新