2010-02-27 18 views
103

Quiero cambiar mi código de:Deserialize de cadena en lugar TextReader

string path = @"c:\Directory\test.xml"; 
XmlSerializer s = new XmlSerializer(typeof(Car)); 

TextReader r = new StreamReader(path); 

Car car = (Car)s.Deserialize(r); 
r.Close(); 

en código que convertiría un XML en una cadena, y luego convertir la serie al objeto de coches.

¿Esto es posible?

Respuesta

214
public static string XmlSerializeToString(this object objectInstance) 
{ 
    var serializer = new XmlSerializer(objectInstance.GetType()); 
    var sb = new StringBuilder(); 

    using (TextWriter writer = new StringWriter(sb)) 
    { 
     serializer.Serialize(writer, objectInstance); 
    } 

    return sb.ToString(); 
} 

public static T XmlDeserializeFromString<T>(this string objectData) 
{ 
    return (T)XmlDeserializeFromString(objectData, typeof(T)); 
} 

public static object XmlDeserializeFromString(this string objectData, Type type) 
{ 
    var serializer = new XmlSerializer(type); 
    object result; 

    using (TextReader reader = new StringReader(objectData)) 
    { 
     result = serializer.Deserialize(reader); 
    } 

    return result; 
} 

utilizarlo:

//Make XML 
var settings = new ObjectCustomerSettings(); 
var xmlString = settings.XmlSerializeToString(); 

//Make Object 
var settings = xmlString.XmlDeserializeFromString<ObjectCustomerSettings>(); 
+4

Mejor: public static T XmlDeserializeFromString (cadena ObjectData) { de retorno (T) XmlDeserializeFromString (ObjectData, typeof (T)); } –

+0

Sí, eso fue un error! lo arreglé ... – Elmer

+0

puedo eliminar "esto" de cadena pública estática XmlSerializeToString (este objeto objectInstance) ?? – user278618

60

Si ha almacenado el código XML dentro de una variable de cadena se puede utilizar un StringReader:

var xml = @"<car/>"; 
var serializer = new XmlSerializer(typeof(Car)); 
using (var reader = new StringReader(xml)) 
{ 
    var car = (Car)serializer.Deserialize(reader); 
} 
+0

usando (lector var = new StringReader (XML)) retorno (Car) nuevo XmlSerializer (typeof (Car)). Deserialize (lector); – Aelphaeis

13

1-liner, toma una cadena XML text y YourType como el tipo de objeto esperado. no es muy diferente de otras respuestas, solo comprimido a 1 línea:

var result = (YourType)new XmlSerializer(typeof(YourType)).Deserialize(new StringReader(text)); 
+4

Cerraría el StringReader después de su uso. – cederlof

3

Desvergonzadamente copiado de Generic deserialization of an xml string

public static T DeserializeFromXmlString<T>(string xmlString) 
    { 
     var serializer = new XmlSerializer(typeof(T)); 
     using (TextReader reader = new StringReader(xmlString)) 
     { 
      return (T) serializer.Deserialize(reader); 
     } 
    } 
3
static T DeserializeXml<T>(string sourceXML) where T : class 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    T result = null; 

    using (TextReader reader = new StringReader(sourceXML)) 
    { 
     result = (T) serializer.Deserialize(reader); 
    } 

    return result; 
} 
Cuestiones relacionadas