c# - XML反序列化泛型方法

标签 c# .net generics serialization xml-deserialization

我有下一个 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/

相关文章:

c# - C# default 关键字在 F# 中的等价物是什么?

c# - 在 .Net 中发送击键以进行控制

java - 为什么在将对象类型更改为泛型后,我仍然能够将任何对象添加到具有原始类型引用类型的列表中?

c# - 从 DataTable 中删除特定行

c# - .net 的错误报告框架

c# - Xamarin.Forms 中的 Device.StartTimer 与 System.Threading.Timer

Java/Groovy 泛型类型推断

java - 具有参数化集合的泛型?

c# - 包含 AJAX 按钮的屏幕抓取网页

c# - 第一次使用 Parallel.ForEach UI 仍然锁定