在XmlSerializer中使用generics

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

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

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

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

 public MyObject LoadData() { // Generics here. XmlSerializer xmlSerializer = new XmlSerializer(); using (TextReader reader = new StreamReader(settingsFileName)) { // No casts nevermore. return xmlSerializer.Deserialize(reader); } } 

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

 public T ConvertXml(string xml) { var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(new StringReader(xml)); } 

这样您就不需要将整个类设为通用类,您可以像这样使用它:

 var result = ConvertXml(source); 

使序列化类/方法通用:

 public T LoadData() { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (TextReader reader = new StreamReader(settingsFileName)) { return (T)xmlSerializer.Deserialize(reader); } } 

一个简单的通用包装器:

 public class GenericSerializer : XmlSerializer { public GenericSerializer(): base(typeof(T)) { } } 

这会将您的对象序列化到bin / debug文件夹:

 static void Main(string[] args) { Person p = new Person { Name = "HelloWorld" }; GenericSerializer ser = new GenericSerializer(); ser.Serialize(new StreamWriter("person.xml"), p); } 

试试这个。

 public class SerializeConfig where T : class { public static void Serialize(string path, T type) { var serializer = new XmlSerializer(type.GetType()); using (var writer = new FileStream(path, FileMode.Create)) { serializer.Serialize(writer, type); } } public static T DeSerialize(string path) { T type; var serializer = new XmlSerializer(typeof(T)); using (var reader = XmlReader.Create(path)) { type = serializer.Deserialize(reader) as T; } return type; } } 

总是为我工作

  public static string ObjectToXmlSerialize(T dataToSerialize) { try { var stringwriter = new System.IO.StringWriter(); var serializer = new XmlSerializer(typeof(T)); serializer.Serialize(stringwriter, dataToSerialize); return stringwriter.ToString(); } catch (Exception ex) { } return null; } 

这是反序列化:

  public static T XmlDeserializeToObject(string xmlText) { try { var stringReader = new System.IO.StringReader(xmlText); var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(stringReader); } catch (Exception ex) { } return default(T); }