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
Better:public static T XmlDeserializeFromString <T>(string objectData){return(T)XmlDeserializeFromString(objectData、typeof(T)); }
Lee Treveil、

1
パブリック静的文字列XmlSerializeToString(this object objectInstance)から「this」を削除できますか?
user278618 2010

'this'は削除できますが、メソッドは拡張メソッドではなくなりました。メソッドを拡張メソッドにすることで、これが可能になります。string s = "blah!"; string xml = s.XmlSerializeToString(); 注:使用中の拡張メソッドを保持する静的クラスの名前空間を参照してください。そうしないと、拡張メソッドが機能しません。'this'を使用する唯一の理由は、これを拡張メソッドにすることです。これを削除しても完全に安全です。
Elmer

「これ」がありません。それを拡張として表示するには、2番目のメソッドで。 public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }メインの投稿を編集します。
Omzig 2014年

StringReader欠けている部分です。ありがとう。
プリモ2014年

83

XMLを文字列変数内に格納している場合は、StringReaderを使用できます。

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

using(var reader = new StringReader(xml))return(Car)new XmlSerializer(typeof(Car))。Deserialize(reader);
Aelphaeis 2014年

15

ワンライナー。XML文字列textを受け取りYourType、予期されるオブジェクトタイプとして使用します。他の回答とあまり変わらず、1行に圧縮するだけです。

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

4
使用後はStringReaderを閉じます。
cederlof 2013年

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.