Десериализовать из строки вместо TextReader

135

Я хочу изменить свой код с:

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.

Это возможно?

user278618
источник

Ответы:

260
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 <T> (строка objectData) {return (T) XmlDeserializeFromString (objectData, typeof (T)); }
Ли Тревейл
1
я могу удалить "это" из публичной статической строки XmlSerializeToString (этот объект objectInstance) ??
user278618
Вы можете удалить «это», но тогда этот метод больше не является методом расширения. Сделав метод методом расширения, это возможно: string s = "blah!"; строка xml = s.XmlSerializeToString (); примечание: обязательно укажите пространство имен статического класса, который содержит методы расширения в вашем использовании, иначе методы расширения не будут работать! Единственная причина использования «this» - сделать его методом расширения, удалить его полностью безопасно.
Элмер
Вам не хватает «этого». во втором методе, чтобы он отображался как расширение. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Я собираюсь редактировать основной пост.
Омциг
StringReaderэто недостающая часть. Спасибо.
primo
83

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

var xml = @"<car/>";
var serializer = new XmlSerializer(typeof(Car));
using (var reader = new StringReader(xml))
{
    var car = (Car)serializer.Deserialize(reader);
}
Дарин димитров
источник
используя (var reader = new StringReader (xml)) return (Car) new XmlSerializer (typeof (Car)). Deserialize (reader);
Эльфеи
15

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

var result =  (YourType)new XmlSerializer(typeof(YourType)).Deserialize(new StringReader(text));
guest0815
источник
4
Я бы закрыл StringReader после использования.
cederlof
8
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;
}
Йаман
источник