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
由于该方法现在返回通用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");