Deserialize จากสตริงแทน TextReader


138

ฉันต้องการเปลี่ยนรหัสจาก:

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 เป็นสตริงแล้วแปลงสตริงเป็นรถวัตถุ

เป็นไปได้หรือไม่

คำตอบ:


265
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)); }
Lee Treveil

1
ฉันสามารถลบ "this" ออกจากสตริงสาธารณะแบบคงที่ XmlSerializeToString (วัตถุนี้ objectInstance) ได้หรือไม่?
user278618

คุณสามารถลบ 'this' ได้ แต่วิธีนี้ไม่ใช่วิธีการขยายอีกต่อไป ด้วยการทำให้วิธีนี้เป็นวิธีการขยายสิ่งนี้เป็นไปได้: string s = "blah!"; สตริง xml = s.XmlSerializeToString (); หมายเหตุ: อย่าลืมอ้างอิงเนมสเปซของคลาสแบบคงที่ที่เก็บเมธอดส่วนขยายไว้ในการใช้งานของคุณมิฉะนั้นวิธีการขยายจะไม่ทำงาน! เหตุผลเดียวในการใช้ "this" คือทำให้เป็นวิธีการขยายการลบออกอย่างปลอดภัย
Elmer

คุณไม่มี "this" ในวิธีที่ 2 ของคุณเพื่อให้แสดงเป็นส่วนขยาย public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }ฉันกำลังจะแก้ไขเสาเอก
Omzig

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 = new StringReader (xml)) return (Car) new XmlSerializer (typeof (Car)) Deserialize (reader);
Aelphaeis

16

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.