2010-04-19 56 views
9

使用泛型當在C#中使用XML序列化,我使用這樣的代碼:與XmlSerializer的

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

(以及類似的代碼反序列化)。

它需要鑄造,並不是很好。有沒有一種方法,直接在.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); 
    } 
} 
+0

一個通用的'XmlSerializer'如圖你上面的例子並不存在。如果您需要這些功能,您將需要創建自己的包裝。 – 2010-04-19 19:31:16

回答

17

的除了@Oded,可以使method Generic藏漢:

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

這種方式你不需要使整個類通用,你可以像這樣使用它:

var result = ConvertXml<MyObject>(source); 
+2

接受這個答案,而不是Oded之一,因爲這個不需要類,事實上,大多數情況下,我不想創建一個(例如,在小型項目中訪問所有XML數據時來自一個班級)。 感謝大家的回答。 – 2010-04-19 20:51:12

+0

爲什麼這個答案被接受?它包含一個代碼錯誤(在使用分號)和XmlSerializer類不是IDisposable,因此不能在一個使用範圍內使用,所以它不會編譯有兩個原因... – Koen 2010-07-13 09:49:28

+1

@Koen,對不起,錯過了,謝謝你的頭向上。更正它。 – 2010-07-13 20:20:15

11

讓你的序列化類/方法通用:

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

重構該代碼! ;) – 2010-04-19 19:33:07

+1

@Filip - 相當正確...我忘了通用參數... – Oded 2010-04-19 19:37:48

+0

這就是我在我的大部分項目中所做的。但我只是想知道爲什麼這不嵌入到最新版本的.NET Framework中。 – 2010-04-19 20:47:25

2

一個簡單的通用包裝:

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

這將你的序列化對象到bin/debug文件夾:

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

試試這個。

public class SerializeConfig<T> 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; 
    } 
} 
0

總是工作對我的

public static string ObjectToXmlSerialize<T>(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<T>(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); 
    }