在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); }