使用泛型与XmlSerializer

Ars*_*nko 14 c# oop generics xml-serialization xmlserializer

在C#中使用XML序列化时,我使用如下代码:

public MyObject LoadData()
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));
    using (TextReader reader = new StreamReader(settingsFileName))
    {
        return (MyObject)xmlSerializer.Deserialize(reader);
    }
}
Run Code Online (Sandbox Code Playgroud)

(以及类似的反序列化代码).

它需要铸造而且不是很好.有没有办法,直接在.NET Framework中使用泛型与序列化?也就是说写下这样的东西:

public MyObject LoadData()
{
    // Generics here.
    XmlSerializer<MyObject> xmlSerializer = new XmlSerializer();
    using (TextReader reader = new StreamReader(settingsFileName))
    {
        // No casts nevermore.
        return xmlSerializer.Deserialize(reader);
    }
}
Run Code Online (Sandbox Code Playgroud)

Fil*_*erg 24

作为@Oded的补充,您可以使用Generic方法:

public T ConvertXml<T>(string xml)
{
    var serializer = new XmlSerializer(typeof(T));
    return (T)serializer.Deserialize(new StringReader(xml));
}
Run Code Online (Sandbox Code Playgroud)

这样你就不需要使整个类变得通用,你可以像这样使用它:

var result = ConvertXml<MyObject>(source);
Run Code Online (Sandbox Code Playgroud)

  • 接受这个答案,而不是Oded,因为这个不需要类,事实上,大多数时候,我不想创建一个(例如,在一个小项目中,所有XML数据都是从一节课).感谢大家的回答. (2认同)
  • @Koen,对不起错过了,谢谢你的抬头.纠正了它. (2认同)

Ode*_*ded 12

使序列化类/方法通用:

public T LoadData<T>()
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
    using (TextReader reader = new StreamReader(settingsFileName))
    {
        return (T)xmlSerializer.Deserialize(reader);
    }
}
Run Code Online (Sandbox Code Playgroud)