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

Чи можливо це?

Відповіді:


259
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> (string objectData) {return (T) XmlDeserializeFromString (objectData, typeof (T)); }
Лі Тревейл

1
чи можу я видалити "це" із загальнодоступного статичного рядка XmlSerializeToString (цей об'єкт objectInstance) ??
користувач278618

Ви можете видалити "це", але тоді метод вже не є методом розширення. Зробивши метод методом розширення, це можливо: string s = "blah!"; рядок xml = s.XmlSerializeToString (); зауважте: обов'язково посилайтеся на простір імен статичного класу, який містить методи розширення у ваших ужингах, інакше методи розширення не працюватимуть! Єдина причина використання "цього" - це зробити метод розширення, видалити його повністю безпечно.
Elmer

Ви пропускаєте "це". у вашому 2-му методі, щоб він показав як продовження. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Я збираюся редагувати основну публікацію.
Омзіг

StringReaderє відсутнім шматком. Дякую.
прим

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 = новий StringReader (xml)) return (Car) новий XmlSerializer (typeof (Автомобіль)). Deserialize (read);
Aelphaeis

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.