XML反序列化通用方法

我有下一个XML文件:

  d639a54f-baca-11e1-8067-001fd09b1dfd -24145   e3b3b4cd-bb8e-11e1-8067-001fd09b1dfd 0.28   

我把它反序列化到这个类:

 [XmlRoot("Root", IsNullable = false)] public class DocBalanceCollection { [XmlElement("Document")] public List DocsBalanceItems = new List(); } 

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文件吗? 我可以编写单个通用方法来反序列化所有这些吗?

想到的唯一解决方案 – 为所有这些类创建一个接口。 有任何想法吗?

您可以使用XmlSerializer对通用List进行反序列化。 但是,首先需要将XmlType属性添加到DocBalanceItem以便它知道列表元素的命名方式。

 [XmlType("Document")] public class DocBalanceItem { [XmlElement("Id")] public Guid DocId { get; set; } [XmlElement("Balance")] public decimal? BalanceAmount { get; set; } } 

然后修改DeserializeDocBalances()方法以返回List并将序列化程序传递给XmlRootAttribute实例,以指示它查找Root作为根元素:

 public List DeserializeList(string filePath) { var itemList = new List(); if (File.Exists(filePath)) { var serializer = new XmlSerializer(typeof(List), new XmlRootAttribute("Root")); TextReader reader = new StreamReader(filePath); itemList = (List)serializer.Deserialize(reader); reader.Close(); } return itemList; } 

那你应该可以做到

var list = DeserializeList("somefile.xml");

由于该方法现在返回通用List ,因此您不再需要为每种类型创建自定义集合。

PS – 我使用提供的文档在本地测试了此解决方案,它确实有效。

任何可字符串对象都可以通过以下方法反序列化。

 public static T genericDeserializeSingleObjFromXML(T value, string XmalfileStorageFullPath) { T Tvalue = default(T); try { XmlSerializer deserializer = new XmlSerializer(typeof(T)); TextReader textReader = new StreamReader(XmalfileStorageFullPath); Tvalue = (T)deserializer.Deserialize(textReader); textReader.Close(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show("serialization Error : " + ex.Message); } return Tvalue; } 

为了使用此方法,您应该已经在xml文件中序列化对象。 调用方法是:

 XmlSerialization.genericDeserializeSingleObjFromXML(new ObjectName(), "full path of the XML file");