我有下一个 XML 文件:
<Root>
<Document>
<Id>d639a54f-baca-11e1-8067-001fd09b1dfd</Id>
<Balance>-24145</Balance>
</Document>
<Document>
<Id>e3b3b4cd-bb8e-11e1-8067-001fd09b1dfd</Id>
<Balance>0.28</Balance>
</Document>
</Root>
我将它反序列化为这个类:
[XmlRoot("Root", IsNullable = false)]
public class DocBalanceCollection
{
[XmlElement("Document")]
public List<DocBalanceItem> DocsBalanceItems = new List<DocBalanceItem>();
}
DocBalanceItem
是:
public class DocBalanceItem
{
[XmlElement("Id")]
public Guid DocId { get; set; }
[XmlElement("Balance")]
public decimal? BalanceAmount { get; set; }
}
这是我的反序列化方法:
public DocBalanceCollection DeserializeDocBalances(string filePath)
{
var docBalanceCollection = new DocBalanceCollection();
if (File.Exists(filePath))
{
var serializer = new XmlSerializer(docBalanceCollection.GetType());
TextReader reader = new StreamReader(filePath);
docBalanceCollection = (DocBalanceCollection)serializer.Deserialize(reader);
reader.Close();
}
return docBalanceCollection;
}
一切正常,但我有很多 XML 文件。除了编写 Item
类之外,我还必须为每个类编写 ItemCollection
类。而且我还必须为每个实现 DeserializeItems
方法。
我可以在不创建 ItemCollection
类的情况下反序列化我的 XML 文件吗?我可以编写一个通用方法来反序列化所有这些方法吗?
想到的唯一解决方案 - 为所有这些类创建一个接口(interface)。有什么想法吗?
最佳答案
您可以反序列化一个通用的 List<T>
使用 XmlSerializer 就好了。但是,首先您需要添加 XmlType
属性给你的 DocBalanceItem
所以它知道列表元素是如何命名的。
[XmlType("Document")]
public class DocBalanceItem
{
[XmlElement("Id")]
public Guid DocId { get; set; }
[XmlElement("Balance")]
public decimal? BalanceAmount { get; set; }
}
然后修改你的DeserializeDocBalances()
返回 List<T>
的方法并向序列化程序传递 XmlRootAttribute
实例指示它寻找 Root
作为根元素:
public List<T> DeserializeList<T>(string filePath)
{
var itemList = new List<T>();
if (File.Exists(filePath))
{
var serializer = new XmlSerializer(typeof(List<T>), new XmlRootAttribute("Root"));
TextReader reader = new StreamReader(filePath);
itemList = (List<T>)serializer.Deserialize(reader);
reader.Close();
}
return itemList;
}
那么你应该可以做到
var list = DeserializeList<DocBalanceItem>("somefile.xml");
因为该方法现在返回一个通用的 List<T>
,您不再需要为每种类型创建自定义集合。
附言- 我使用提供的文档在本地测试了此解决方案,它确实有效。
关于c# - XML反序列化泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14562415/