我的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
方法并序列化整个List与x.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>
我希望这将有助于您实现学习更多序列化知识的目标。