2010-04-19 6 views
9

Quando si utilizza la serializzazione XML in C#, io uso il codice come questo:Utilizzo di farmaci generici con XmlSerializer

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

(e il codice simile per deserializzazione).

Richiede il casting e non è proprio bello. C'è un modo, direttamente in .NET Framework, di usare i generici con la serializzazione? Vale a dire a scrivere qualcosa del tipo:

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

Un generico 'XmlSerializer' come mostrato nel tuo esempio sopra non esiste. Sarà necessario creare il proprio wrapper se si desidera questa funzionalità. –

risposta

17

Un'aggiunta al @Oded, è possibile effettuare la method Generic aswell:

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

In questo modo non è necessario rendere l'intera classe generica e si può usare in questo modo:

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

Accettare questa risposta, piuttosto che Oded, perché questa non richiede la classe, e infatti, la maggior parte delle volte, non voglio crearne una (ad esempio quando, in un piccolo progetto, si accede a tutti i dati XML da una classe). Grazie a tutti per aver risposto. –

+0

Perché questa risposta è stata accettata? Contiene un errore di codice (punto e virgola in uso) e la classe XmlSerializer non è IDisposable, quindi non può essere utilizzata in un ambito di utilizzo, quindi non verrà compilata per due ragioni ... – Koen

+1

@ Koen, mi dispiace mancare, grazie per le teste su. Corretto –

11

Fai la tua classe di serializzazione/metodo generico:

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

Refactor that code! ;) –

+1

@Filip - Giusto ... Ho dimenticato il parametro generico ... – Oded

+0

Questo è quello che sto facendo nella maggior parte dei miei progetti. Ma mi sono chiesto perché questo non è incorporato nelle ultime versioni di .NET Framework. –

2

Un semplice wrapper generico:

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

Ciò serializzare l'oggetto nella cartella 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

Prova questo.

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

lavorare sempre di me

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

e questo è per Deserialize:

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