2010-02-27 2 views
103

Я хочу изменить свой код от:Deserialize из строки вместо 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(); 

в код, который будет конвертировать XML в строку, а затем преобразовать строку в объект Car.

Возможно ли это?

ответ

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

Чтобы использовать его:

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

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

лучше: общественности статической T XmlDeserializeFromString (строка ObjectData) { возвращение (T) XmlDeserializeFromString (ObjectData, TypeOf (T)); } –

+0

Да, это была ошибка! исправлено это ... – Elmer

+0

можно удалить «это» из общедоступная статическая строка XmlSerializeToString (этот объект objectInstance) ?? – user278618

60

Если у вас есть XML хранится в строковой переменной можно использовать StringReader:

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

использованием (вар считывающего = новый StringReader (XML)) возврата (Car) новый XmlSerializer (typeof (Car)). Deserialize (reader); – Aelphaeis

13

1-вкладышем, принимает строку XML text и YourType как ожидаемый тип объекта. не сильно отличается от других ответов, просто сжимается до 1 линии:

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

Я бы закрыл StringReader после использования. – cederlof

3

бесстыдно скопирована с 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; 
} 
Смежные вопросы