Десериализовать из строки вместо 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.

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

Ответы:


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.