2010-04-19 10 views
9

Al utilizar serialización XML en C#, que utilizan un código como éste:Uso de medicamentos genéricos con XmlSerializer

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

(y el código similar para deserialización).

Requiere fundición y no es realmente agradable. ¿Hay alguna manera, directamente en .NET Framework, de usar genéricos con serialización? Es decir, a escribir algo como:

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 genérico 'XmlSerializer' como se muestra en el ejemplo anterior no existe. Tendrá que crear su propio contenedor si desea esta funcionalidad. –

Respuesta

17

Una adición a @Oded, puede tomar la method Generic aswell:

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

De esta manera no necesita hacer toda la clase genérica y puede usarla así:

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

Al aceptar esta respuesta, en lugar de Oded uno, porque este no requiere clase, y de hecho, la mayoría de las veces, no quiero crear uno (por ejemplo, cuando, en un proyecto pequeño, se accede a todos los datos XML) de una clase). Gracias a todos por responder. –

+0

¿Por qué se aceptó esta respuesta? Contiene un error de código (punto y coma en uso) y la clase XmlSerializer no es IDisposable, por lo tanto no se puede usar en un ámbito de uso, por lo que no se compilará por dos razones ... – Koen

+1

@Koen, lo perdí, gracias por las cabezas arriba. Corregido. –

11

Haga su clase serialización/método genérico:

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

Refactorizar ese código! ;) –

+1

@Filip - Muy bien ... Olvidé el parámetro genérico ... – Oded

+0

Eso es lo que estoy haciendo en la mayoría de mis proyectos. Pero me pregunté por qué esto no está incrustado en las últimas versiones de .NET Framework. –

2

Un simple envoltorio genérico:

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

Esto serializar el objeto en la carpeta 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

Prueba esto.

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

siempre funciona para mí de

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

y esto es para 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); 
    } 
Cuestiones relacionadas